diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-03-27 23:16:15 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-03-27 23:16:15 +0300 |
| commit | 5e9000fcdcdb86981d52841abf1c4d5385ae2ba8 (patch) | |
| tree | 7ca8af8c114d14986a05ce0cd045c71a4b400d6c /generator | |
| parent | d76ec81388454c24ee99a601830ed39cfa50063c (diff) | |
| download | nimpb-5e9000fcdcdb86981d52841abf1c4d5385ae2ba8.tar.gz nimpb-5e9000fcdcdb86981d52841abf1c4d5385ae2ba8.zip | |
Initial support for oneofs
Diffstat (limited to 'generator')
| -rw-r--r-- | generator/descriptor_pb.nim | 33 | ||||
| -rw-r--r-- | generator/protoc_gen_nim.nim | 18 |
2 files changed, 50 insertions, 1 deletions
diff --git a/generator/descriptor_pb.nim b/generator/descriptor_pb.nim index 5d07365..2a734e8 100644 --- a/generator/descriptor_pb.nim +++ b/generator/descriptor_pb.nim @@ -100,6 +100,14 @@ const typeName: "EnumDescriptorProto", packed: false ), + FieldDesc( + name: "oneof_decl", + number: 8, + ftype: FieldType.Message, + label: FieldLabel.Repeated, + typeName: "OneofDescriptorProto", + packed: false + ), ] ) @@ -198,6 +206,14 @@ const typeName: "FieldOptions", packed: false ), + FieldDesc( + name: "oneof_index", + number: 9, + ftype: FieldType.Int32, + label: FieldLabel.Optional, + typeName: "", + packed: false + ), ] ) @@ -248,6 +264,20 @@ const ] ) + OneofDescriptorProtoDesc = MessageDesc( + name: "OneofDescriptorProto", + fields: @[ + FieldDesc( + name: "name", + number: 1, + ftype: FieldType.String, + label: FieldLabel.Optional, + typeName: "", + packed: false + ), + ] + ) + generateEnumType(FieldDescriptorProto_LabelDesc) generateEnumProcs(FieldDescriptorProto_LabelDesc) @@ -266,6 +296,9 @@ generateMessageProcs(FieldOptionsDesc) generateMessageType(FieldDescriptorProtoDesc) generateMessageProcs(FieldDescriptorProtoDesc) +generateMessageType(OneofDescriptorProtoDesc) +generateMessageProcs(OneofDescriptorProtoDesc) + generateMessageType(DescriptorProtoDesc) generateMessageProcs(DescriptorProtoDesc) diff --git a/generator/protoc_gen_nim.nim b/generator/protoc_gen_nim.nim index 8b38815..f35f1cc 100644 --- a/generator/protoc_gen_nim.nim +++ b/generator/protoc_gen_nim.nim @@ -27,10 +27,12 @@ type ftype: FieldType typeName: string packed: bool + oneofIdx: int Message = ref object names: Names fields: seq[Field] + oneofs: seq[string] ProcessedFile = ref object name: string @@ -89,6 +91,11 @@ proc newField(desc: FieldDescriptorProto): Field = result.ftype = convertFieldType(desc.type) result.typeName = "" result.packed = desc.options.packed + result.oneofIdx = + if hasOneof_index(desc): + desc.oneof_index + else: + -1 if result.ftype == FieldType.Message or result.ftype == FieldType.Enum: result.typeName = $initNamesFromTypeName(desc.type_name) @@ -100,12 +107,16 @@ proc newMessage(names: Names, desc: DescriptorProto): Message = result.names = names result.fields = @[] + result.oneofs = @[] log(&"newMessage {$result.names}") for field in desc.field: add(result.fields, newField(field)) + for oneof in desc.oneof_decl: + add(result.oneofs, oneof.name) + proc newEnum(names: Names, desc: EnumDescriptorProto): Enum = new(result) @@ -238,6 +249,7 @@ proc generateDesc(field: Field): string = addLine(result, &"label: FieldLabel.{field.label},", 16) addLine(result, &"typeName: \"{field.typeName}\",", 16) addLine(result, &"packed: {field.packed},", 16) + addLine(result, &"oneofIdx: {field.oneofIdx},", 16) addLine(result, "),", 12) proc generateDesc(message: Message): string = @@ -247,7 +259,11 @@ proc generateDesc(message: Message): string = addLine(result, "fields: @[", 8) for field in message.fields: result &= generateDesc(field) - addLine(result, "]", 8) + addLine(result, "],", 8) + addLine(result, "oneofs: @[", 8) + for oneof in message.oneofs: + addLine(result, &"\"{oneof}\",", 12) + addLine(result, "],", 8) addLine(result, ")", 4) proc generateDesc(e: Enum): string = |
