Skip to content

Commit

Permalink
Map support.
Browse files Browse the repository at this point in the history
  • Loading branch information
eerimoq committed Jan 8, 2020
1 parent aa8b6df commit d809cf0
Show file tree
Hide file tree
Showing 6 changed files with 508 additions and 19 deletions.
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ About

Known limitations:

- Options, services (gRPC), reserved fields and maps are ignored.
- Options, services (gRPC) and reserved fields are ignored.

Project homepage: https://github.com/eerimoq/pbtools

Expand Down
38 changes: 31 additions & 7 deletions pbtools/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -372,11 +372,16 @@ def name_snake_case(self):

class MessageField(Field):

def __init__(self, tokens):
super().__init__(load_message_type(tokens[1]),
tokens[2],
int(tokens[4]))
self.repeated = bool(tokens[0])
def __init__(self, type, name, field_number, repeated):
super().__init__(type, name, field_number)
self.repeated = repeated

@classmethod
def from_field_tokens(cls, tokens):
return cls(load_message_type(tokens[1]),
tokens[2],
int(tokens[4]),
bool(tokens[0]))


class Message:
Expand All @@ -390,25 +395,44 @@ def __init__(self, tokens, namespace):
self.enums = []
self.messages = []
self.oneofs = []
self.maps = []
self.namespace = namespace

for item in tokens[3]:
kind = item[0]
sub_namespace = namespace + [self.name]

if kind == 'field':
self.fields.append(MessageField(item[1]))
self.fields.append(MessageField.from_field_tokens(item[1]))
elif kind == 'enum':
self.enums.append(Enum(item, sub_namespace))
elif kind == 'message':
self.messages.append(Message(item, sub_namespace))
elif kind == 'oneof':
self.oneofs.append(Oneof(item, sub_namespace))
elif kind in ['map', 'reserved', ';']:
elif kind == 'map':
self._load_map_field(item, sub_namespace)
elif kind in ['reserved', ';']:
pass
else:
raise InternalError(kind)

def _load_map_field(self, tokens, sub_namespace):
key_type = tokens[2]
value_type = load_message_type(tokens[4])[-1]
name = tokens[6]
field_number = int(tokens[8])
map_type = f'PbtoolsMap{name.title()}'
map_message_tokens = [
'message',
map_type, '{', [
('field', [[], [[], [key_type]], 'key', '=', '1', [], ';']),
('field', [[], [[], [value_type]], 'value', '=', '2', [], ';'])
], '}'
]
self.messages.append(Message(map_message_tokens, sub_namespace))
self.fields.append(MessageField([map_type], name, field_number, True))

@property
def repeated_fields(self):
return [field for field in self.fields if field.repeated]
Expand Down
2 changes: 1 addition & 1 deletion pbtools/version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '0.25.0'
__version__ = '0.26.0'

0 comments on commit d809cf0

Please sign in to comment.