diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-01 17:36:19 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-01 17:36:19 +0300 |
| commit | c5badf9c9ce3e54ef05a257abd10847b40ce113a (patch) | |
| tree | 5ad6c940ecc26c6603aa55857c7e7263ee2938c3 | |
| parent | 75ec5d643ce7a10b05bb18de3fc7a3e678183103 (diff) | |
| download | nimpb-c5badf9c9ce3e54ef05a257abd10847b40ce113a.tar.gz nimpb-c5badf9c9ce3e54ef05a257abd10847b40ce113a.zip | |
Add support for empty messages
| -rw-r--r-- | generator/protoc_gen_nim.nim | 108 |
1 files changed, 58 insertions, 50 deletions
diff --git a/generator/protoc_gen_nim.nim b/generator/protoc_gen_nim.nim index 4a1e3df..0a3c073 100644 --- a/generator/protoc_gen_nim.nim +++ b/generator/protoc_gen_nim.nim @@ -594,6 +594,10 @@ iterator genWriteMessageProc(msg: Message): string = if isMessage(field): yield indent(&"writeVarint(stream, sizeOf{field.typeName}(message.{field.accessor}))", 8) yield indent(&"{writer}(stream, message.{field.accessor})", 8) + + if len(msg.fields) == 0: + yield indent("discard", 4) + yield "" iterator genReadMapKVProc(msg: Message): string = @@ -637,58 +641,59 @@ iterator genReadMapKVProc(msg: Message): string = iterator genReadMessageProc(msg: Message): string = yield &"proc read{msg.names}*(stream: ProtobufStream): {msg.names} =" yield indent(&"result = new{msg.names}()", 4) - yield indent("while not atEnd(stream):", 4) - yield indent("let", 8) - yield indent("tag = readTag(stream)", 12) - yield indent("wireType = getTagWireType(tag)", 12) - yield indent("case getTagFieldNumber(tag)", 8) - for field in msg.fields: - let - reader = &"read{field.typeName}" - setter = - if isRepeated(field): - &"add{field.name}" + if len(msg.fields) > 0: + yield indent("while not atEnd(stream):", 4) + yield indent("let", 8) + yield indent("tag = readTag(stream)", 12) + yield indent("wireType = getTagWireType(tag)", 12) + yield indent("case getTagFieldNumber(tag)", 8) + for field in msg.fields: + let + reader = &"read{field.typeName}" + setter = + if isRepeated(field): + &"add{field.name}" + else: + &"set{field.name}" + yield indent(&"of {field.number}:", 8) + if isRepeated(field): + if isMapEntry(field): + yield indent("let", 12) + yield indent("size = readVarint(stream)", 16) + yield indent("data = readStr(stream, int(size))", 16) + yield indent("pbs = newProtobufStream(newStringStream(data))", 16) + yield indent(&"read{field.typeName}KV(pbs, result.{field.name})", 12) + elif isNumeric(field): + yield indent("if wireType == WireType.LengthDelimited:", 12) + yield indent("let", 16) + yield indent("size = readVarint(stream)", 20) + yield indent("start = uint64(getPosition(stream))", 20) + yield indent("var consumed = 0'u64", 16) + yield indent("while consumed < size:", 16) + yield indent(&"{setter}(result, {reader}(stream))", 20) + yield indent("consumed = uint64(getPosition(stream)) - start", 20) + yield indent("if consumed != size:", 16) + yield indent("raise newException(Exception, \"packed field size mismatch\")", 20) + yield indent("else:", 12) + yield indent(&"{setter}(result, {reader}(stream))", 16) + elif isMessage(field): + yield indent("let", 12) + yield indent("size = readVarint(stream)", 16) + yield indent("data = readStr(stream, int(size))", 16) + yield indent("pbs = newProtobufStream(newStringStream(data))", 16) + yield indent(&"{setter}(result, {reader}(pbs))", 12) else: - &"set{field.name}" - yield indent(&"of {field.number}:", 8) - if isRepeated(field): - if isMapEntry(field): - yield indent("let", 12) - yield indent("size = readVarint(stream)", 16) - yield indent("data = readStr(stream, int(size))", 16) - yield indent("pbs = newProtobufStream(newStringStream(data))", 16) - yield indent(&"read{field.typeName}KV(pbs, result.{field.name})", 12) - elif isNumeric(field): - yield indent("if wireType == WireType.LengthDelimited:", 12) - yield indent("let", 16) - yield indent("size = readVarint(stream)", 20) - yield indent("start = uint64(getPosition(stream))", 20) - yield indent("var consumed = 0'u64", 16) - yield indent("while consumed < size:", 16) - yield indent(&"{setter}(result, {reader}(stream))", 20) - yield indent("consumed = uint64(getPosition(stream)) - start", 20) - yield indent("if consumed != size:", 16) - yield indent("raise newException(Exception, \"packed field size mismatch\")", 20) - yield indent("else:", 12) - yield indent(&"{setter}(result, {reader}(stream))", 16) - elif isMessage(field): - yield indent("let", 12) - yield indent("size = readVarint(stream)", 16) - yield indent("data = readStr(stream, int(size))", 16) - yield indent("pbs = newProtobufStream(newStringStream(data))", 16) - yield indent(&"{setter}(result, {reader}(pbs))", 12) - else: - yield indent(&"{setter}(result, {reader}(stream))", 12) - else: - if isMessage(field): - yield indent("let", 12) - yield indent("size = readVarint(stream)", 16) - yield indent("data = readStr(stream, int(size))", 16) - yield indent("pbs = newProtobufStream(newStringStream(data))", 16) - yield indent(&"{setter}(result, {reader}(pbs))", 12) + yield indent(&"{setter}(result, {reader}(stream))", 12) else: - yield indent(&"{setter}(result, {reader}(stream))", 12) - yield indent("else: skipField(stream, wireType)", 8) + if isMessage(field): + yield indent("let", 12) + yield indent("size = readVarint(stream)", 16) + yield indent("data = readStr(stream, int(size))", 16) + yield indent("pbs = newProtobufStream(newStringStream(data))", 16) + yield indent(&"{setter}(result, {reader}(pbs))", 12) + else: + yield indent(&"{setter}(result, {reader}(stream))", 12) + yield indent("else: skipField(stream, wireType)", 8) yield "" iterator genSizeOfMapKVProc(message: Message): string = @@ -745,6 +750,9 @@ if has{field.name}(message): if isMessage(field): yield indent("result = result + sizeOfUInt64(sizeOfField)", 8) + if len(msg.fields) == 0: + yield indent("result = 0", 4) + yield "" iterator genProcs(msg: Message): string = |
