aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-03 20:22:08 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-03 20:22:08 +0300
commit54280463ac487e331daa43453058d02599f85102 (patch)
tree8790efccb67cefcb08359131745cbf68552f0d84 /src
parente2cfc6717ae8acd9c47a132fa2cbc8446b5920c5 (diff)
downloadnimpb-54280463ac487e331daa43453058d02599f85102.tar.gz
nimpb-54280463ac487e331daa43453058d02599f85102.zip
Generate less and more cleaner code
Diffstat (limited to 'src')
-rw-r--r--src/protobuf/protobuf.nim94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/protobuf/protobuf.nim b/src/protobuf/protobuf.nim
index 98bb7a4..d15bfc7 100644
--- a/src/protobuf/protobuf.nim
+++ b/src/protobuf/protobuf.nim
@@ -1,4 +1,6 @@
import endians
+import intsets
+import macros
import streams
import strutils
@@ -190,42 +192,70 @@ proc readTag*(stream: ProtobufStream): Tag =
proc writeInt32*(stream: ProtobufStream, n: int32) =
writeVarint(stream, n.uint64)
+proc writeInt32*(stream: ProtobufStream, n: int32, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Varint)
+ writeInt32(stream, n)
+
proc readInt32*(stream: ProtobufStream): int32 =
result = readVarint(stream).int32
proc writeSInt32*(stream: ProtobufStream, n: int32) =
writeVarint(stream, zigzagEncode(n))
+proc writeSInt32*(stream: ProtobufStream, n: int32, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Varint)
+ writeVarint(stream, zigzagEncode(n))
+
proc readSInt32*(stream: ProtobufStream): int32 =
result = zigzagDecode(readVarint(stream).uint32)
proc writeUInt32*(stream: ProtobufStream, n: uint32) =
writeVarint(stream, n)
+proc writeUInt32*(stream: ProtobufStream, n: uint32, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Varint)
+ writeVarint(stream, n)
+
proc readUInt32*(stream: ProtobufStream): uint32 =
result = readVarint(stream).uint32
proc writeInt64*(stream: ProtobufStream, n: int64) =
writeVarint(stream, n.uint64)
+proc writeInt64*(stream: ProtobufStream, n: int64, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Varint)
+ writeVarint(stream, n.uint64)
+
proc readInt64*(stream: ProtobufStream): int64 =
result = readVarint(stream).int64
proc writeSInt64*(stream: ProtobufStream, n: int64) =
writeVarint(stream, zigzagEncode(n))
+proc writeSInt64*(stream: ProtobufStream, n: int64, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Varint)
+ writeVarint(stream, zigzagEncode(n))
+
proc readSInt64*(stream: ProtobufStream): int64 =
result = zigzagDecode(readVarint(stream))
proc writeUInt64*(stream: ProtobufStream, n: uint64) =
writeVarint(stream, n)
+proc writeUInt64*(stream: ProtobufStream, n: uint64, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Varint)
+ writeVarint(stream, n)
+
proc readUInt64*(stream: ProtobufStream): uint64 =
result = readVarint(stream)
proc writeBool*(stream: ProtobufStream, value: bool) =
writeVarint(stream, value.uint32)
+proc writeBool*(stream: ProtobufStream, n: bool, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Varint)
+ writeVarint(stream, n.uint32)
+
proc readBool*(stream: ProtobufStream): bool =
result = readVarint(stream).bool
@@ -238,6 +268,10 @@ proc writeFixed64*(stream: ProtobufStream, value: uint64) =
write(stream, output)
+proc writeFixed64*(stream: ProtobufStream, n: uint64, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Fixed64)
+ writeFixed64(stream, n)
+
proc readFixed64*(stream: ProtobufStream): uint64 =
var tmp: uint64
if readData(stream, addr(tmp), sizeof(tmp)) != sizeof(tmp):
@@ -247,6 +281,10 @@ proc readFixed64*(stream: ProtobufStream): uint64 =
proc writeSFixed64*(stream: ProtobufStream, value: int64) =
writeFixed64(stream, cast[uint64](value))
+proc writeSFixed64*(stream: ProtobufStream, value: int64, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Fixed64)
+ writeSFixed64(stream, value)
+
proc readSFixed64*(stream: ProtobufStream): int64 =
result = cast[int64](readFixed64(stream))
@@ -259,6 +297,10 @@ proc writeDouble*(stream: ProtobufStream, value: float64) =
write(stream, output)
+proc writeDouble*(stream: ProtobufStream, value: float64, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Fixed64)
+ writeDouble(stream, value)
+
proc readDouble*(stream: ProtobufStream): float64 =
var tmp: uint64
if readData(stream, addr(tmp), sizeof(tmp)) != sizeof(tmp):
@@ -274,6 +316,10 @@ proc writeFixed32*(stream: ProtobufStream, value: uint32) =
write(stream, output)
+proc writeFixed32*(stream: ProtobufStream, value: uint32, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Fixed32)
+ writeFixed32(stream, value)
+
proc readFixed32*(stream: ProtobufStream): uint32 =
var tmp: uint32
if readData(stream, addr(tmp), sizeof(tmp)) != sizeof(tmp):
@@ -283,6 +329,10 @@ proc readFixed32*(stream: ProtobufStream): uint32 =
proc writeSFixed32*(stream: ProtobufStream, value: int32) =
writeFixed32(stream, cast[uint32](value))
+proc writeSFixed32*(stream: ProtobufStream, value: int32, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Fixed32)
+ writeSFixed32(stream, value)
+
proc readSFixed32*(stream: ProtobufStream): int32 =
result = cast[int32](readFixed32(stream))
@@ -295,6 +345,10 @@ proc writeFloat*(stream: ProtobufStream, value: float32) =
write(stream, output)
+proc writeFloat*(stream: ProtobufStream, value: float32, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.Fixed32)
+ writeFloat(stream, value)
+
proc readFloat*(stream: ProtobufStream): float32 =
var tmp: float32
if readData(stream, addr(tmp), sizeof(tmp)) != sizeof(tmp):
@@ -305,9 +359,16 @@ proc writeString*(stream: ProtobufStream, s: string) =
writeUInt64(stream, len(s).uint64)
write(stream, s)
+proc writeString*(stream: ProtobufStream, s: string, fieldNumber: int) =
+ writeTag(stream, fieldNumber, WireType.LengthDelimited)
+ writeString(stream, s)
+
proc writeBytes*(stream: ProtobufStream, s: bytes) =
writeString(stream, string(s))
+proc writeBytes*(stream: ProtobufStream, s: bytes, fieldNumber: int) =
+ writeString(stream, string(s), fieldNumber)
+
proc safeReadStr*(stream: Stream, size: int): string =
result = newString(size)
if readData(stream, addr(result[0]), size) != size:
@@ -400,6 +461,12 @@ proc sizeOfSInt64*(value: int64): uint64 =
proc sizeOfEnum*[T](value: T): uint64 =
result = sizeOfUInt32(value.uint32)
+proc sizeOfLengthDelimited*(size: uint64): uint64 =
+ result = size + sizeOfVarint(size)
+
+proc sizeOfTag*(fieldNumber: int, wiretype: WireType): uint64 =
+ result = sizeOfUInt32(uint32(makeTag(fieldNumber, wiretype)))
+
proc skipField*(stream: ProtobufStream, wiretype: WireType) =
case wiretype
of WireType.Varint:
@@ -421,3 +488,30 @@ proc expectWireType*(actual: WireType, expected: varargs[WireType]) =
let message = "Got wiretype " & $actual & " but expected: " &
join(expected, ", ")
raise newException(UnexpectedWireTypeError, message)
+
+macro writeMessage*(stream: ProtobufStream, message: typed, fieldNumber: int): typed =
+ ## Write a message to a stream with tag and length.
+ let t = getTypeInst(message)
+ result = newStmtList(
+ newCall(
+ ident("writeTag"),
+ stream,
+ fieldNumber,
+ newDotExpr(ident("WireType"), ident("LengthDelimited"))
+ ),
+ newCall(
+ ident("writeVarint"),
+ stream,
+ newCall(ident("sizeOf" & $t), message)
+ ),
+ newCall(
+ ident("write" & $t),
+ stream,
+ message
+ )
+ )
+
+proc excl*(s: var IntSet, values: openArray[int]) =
+ ## Exclude multiple values from an IntSet.
+ for value in values:
+ excl(s, value)