aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-03-25 13:31:35 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-03-25 13:31:35 +0300
commitf26641d78d7ff7a9d19114ec77a9f97378d1f68c (patch)
tree97ca459ac533669d3ced7aa4729e53f898c89b38
parenta3ae66e1aa6a79c3b1c5e23ccdce778bba829c09 (diff)
downloadnimpb-f26641d78d7ff7a9d19114ec77a9f97378d1f68c.tar.gz
nimpb-f26641d78d7ff7a9d19114ec77a9f97378d1f68c.zip
Add packed support to generateSizeOfMessageProc()
-rw-r--r--src/protobuf/gen.nim27
-rw-r--r--src/protobuf/stream.nim2
2 files changed, 19 insertions, 10 deletions
diff --git a/src/protobuf/gen.nim b/src/protobuf/gen.nim
index cd47138..3ef13c2 100644
--- a/src/protobuf/gen.nim
+++ b/src/protobuf/gen.nim
@@ -396,15 +396,24 @@ proc generateSizeOfMessageProc(desc: NimNode): NimNode =
# TODO: packed
if isRepeated(field):
- procBody.add quote do:
- for value in `fname`:
- let
- sizeOfField = `sizeofproc`(value)
- tagSize = sizeOfUint32(uint32(makeTag(`number`, `wiretype`)))
- `resultId` = `resultId` +
- sizeOfField +
- sizeOfUint64(sizeOfField) +
- tagSize
+ if isPacked(field):
+ procBody.add quote do:
+ if `hasproc`(`messageId`):
+ let
+ tagSize = sizeOfUint32(uint32(makeTag(`number`, WireType.LengthDelimited)))
+ dataSize = packedFieldSize(`fname`, `wiretype`)
+ sizeOfSize = sizeOfUint64(dataSize)
+ `resultId` = tagSize + dataSize + sizeOfSize
+ else:
+ procBody.add quote do:
+ for value in `fname`:
+ let
+ sizeOfField = `sizeofproc`(value)
+ tagSize = sizeOfUint32(uint32(makeTag(`number`, `wiretype`)))
+ `resultId` = `resultId` +
+ sizeOfField +
+ sizeOfUint64(sizeOfField) +
+ tagSize
else:
let sizeOfFieldId = ident("sizeOfField")
diff --git a/src/protobuf/stream.nim b/src/protobuf/stream.nim
index 4c026b4..b7e941d 100644
--- a/src/protobuf/stream.nim
+++ b/src/protobuf/stream.nim
@@ -263,7 +263,7 @@ proc packedFieldSize*[T](values: seq[T], wiretype: WireType): uint64 =
for value in values:
result += sizeOfVarint(value)
else:
- discard
+ raise newException(Exception, "invalid wiretype")
proc sizeOfString*(s: string): uint64 =
result = sizeOfVarint(len(s).uint64) + len(s).uint64