aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-06 19:14:47 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-06 19:14:47 +0300
commit4b6946251d36b16048d6b5aa4aee493313cf7ca9 (patch)
treef562efad4a9e2e4681074a3adabc501db999f147
parent1ccf4cb0acf2dc223ed15010e20984dcbe8c67fb (diff)
downloadnimpb-4b6946251d36b16048d6b5aa4aee493313cf7ca9.tar.gz
nimpb-4b6946251d36b16048d6b5aa4aee493313cf7ca9.zip
Add support to read/write/discard unknown fields
-rw-r--r--src/nimpb/nimpb.nim56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/nimpb/nimpb.nim b/src/nimpb/nimpb.nim
index 982b682..ea7cedd 100644
--- a/src/nimpb/nimpb.nim
+++ b/src/nimpb/nimpb.nim
@@ -55,6 +55,21 @@ type
SInt32
SInt64
+ UnknownField* = ref UnknownFieldObj
+ UnknownFieldObj* = object
+ fieldNumber: int
+ case wiretype: WireType
+ of WireType.Varint:
+ vint: uint64
+ of WireType.Fixed64:
+ fixed64: uint64
+ of WireType.LengthDelimited:
+ data: string
+ of WireType.Fixed32:
+ fixed32: uint32
+ else:
+ discard
+
proc wiretype*(ft: FieldType): WireType =
case ft
of FieldType.Double: result = WireType.Fixed64
@@ -533,3 +548,44 @@ proc excl*(s: var IntSet, values: openArray[int]) =
proc readLengthDelimited*(stream: ProtobufStream): string =
let size = int(readVarint(stream))
result = safeReadStr(stream, size)
+
+proc readUnknownField*(stream: ProtobufStream, tag: Tag,
+ fields: var seq[UnknownField]) =
+ var field: UnknownField
+
+ new(field)
+ field.fieldNumber = fieldNumber(tag)
+ field.wireType = wiretype(tag)
+
+ case field.wiretype
+ of WireType.Varint:
+ field.vint = readVarint(stream)
+ of WireType.Fixed64:
+ field.fixed64 = readFixed64(stream)
+ of WireType.Fixed32:
+ field.fixed32 = readFixed32(stream)
+ of WireType.LengthDelimited:
+ let size = readVarint(stream)
+ field.data = safeReadStr(stream, int(size))
+ else:
+ raise newException(Exception, "unsupported wiretype: " & $field.wiretype)
+
+ add(fields, field)
+
+proc writeUnknownFields*(stream: ProtobufStream, fields: seq[UnknownField]) =
+ for field in fields:
+ case field.wiretype
+ of WireType.Varint:
+ writeTag(stream, field.fieldNumber, field.wireType)
+ writeVarint(stream, field.vint)
+ of WireType.Fixed64:
+ writeFixed64(stream, field.fixed64, field.fieldNumber)
+ of WireType.Fixed32:
+ writeFixed32(stream, field.fixed32, field.fieldNumber)
+ of WireType.LengthDelimited:
+ writeString(stream, field.data, field.fieldNumber)
+ else:
+ raise newException(Exception, "unsupported wiretype: " & $field.wiretype)
+
+proc discardUnknownFields*[T](message: T) =
+ message.unknownFields = @[]