Empty objects should not be encoded

This commit is contained in:
Joey Yakimowich-Payne 2020-04-04 07:38:14 -06:00
commit d81f0f0cbe
2 changed files with 29 additions and 4 deletions

View file

@ -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)

View file

@ -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