From d81f0f0cbe4e6146d69e013a6e5d648f7234b734 Mon Sep 17 00:00:00 2001 From: Joey Yakimowich-Payne Date: Sat, 4 Apr 2020 07:38:14 -0600 Subject: [PATCH] Empty objects should not be encoded --- protobuf_serialization.nim | 8 ++++---- tests/test_serialization.nim | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/protobuf_serialization.nim b/protobuf_serialization.nim index 32489f3..bfe06cb 100644 --- a/protobuf_serialization.nim +++ b/protobuf_serialization.nim @@ -112,8 +112,6 @@ proc encodeField*(protobuf: var ProtoBuffer, fieldNum: int, value: SomeLengthDel proc put(stream: OutputStreamVar, value: object) {.inline.} proc encodeField(stream: OutputStreamVar, fieldNum: int, value: object) {.inline.} = - stream.append protoHeader(fieldNum, LengthDelimited) - # This is currently needed in order to get the size # of the output before adding it to the stream. # Maybe there is a better way to do this @@ -121,8 +119,10 @@ proc encodeField(stream: OutputStreamVar, fieldNum: int, value: object) {.inline objStream.put(value) let objOutput = objStream.getOutput() - stream.put(len(objOutput).uint) - stream.put(objOutput) + if objOutput.len > 0: + stream.append protoHeader(fieldNum, LengthDelimited) + stream.put(len(objOutput).uint) + stream.put(objOutput) proc encodeField*(protobuf: var ProtoBuffer, value: object) {.inline.} = protobuf.outstream.encodeField(protobuf.fieldNum, value) diff --git a/tests/test_serialization.nim b/tests/test_serialization.nim index 0247586..87a4fbe 100644 --- a/tests/test_serialization.nim +++ b/tests/test_serialization.nim @@ -116,4 +116,29 @@ suite "Test Varint Encoding": var output = proto.output let decoded = output.decode(Test3) + + assert decoded == obj + + test "Empty object field does not get encoded": + var proto = newProtoBuffer() + + let obj = Test1() + proto.encodeField(1, obj) + + var output = proto.output + assert output.len == 0 + + let decoded = output.decode(Test1) + assert decoded == obj + + test "Empty object does not get encoded": + var proto = newProtoBuffer() + + let obj = Test1() + proto.encode(obj) + + var output = proto.output + assert output.len == 0 + + let decoded = output.decode(Test1) assert decoded == obj \ No newline at end of file