Fix support for char, bool, byte
This commit is contained in:
parent
d81f0f0cbe
commit
d750cac498
2 changed files with 77 additions and 8 deletions
|
|
@ -31,9 +31,10 @@ type
|
||||||
value*: T
|
value*: T
|
||||||
|
|
||||||
SomeSVarint* = int | int64 | int32 | int16 | int8 | enum
|
SomeSVarint* = int | int64 | int32 | int16 | int8 | enum
|
||||||
SomeUVarint* = uint | uint64 | uint32 | uint16 | uint8 | byte | bool | char
|
SomeByte* = byte | bool | char | uint8
|
||||||
|
SomeUVarint* = uint | uint64 | uint32 | uint16 | SomeByte
|
||||||
SomeVarint* = SomeSVarint | SomeUVarint
|
SomeVarint* = SomeSVarint | SomeUVarint
|
||||||
SomeLengthDelimited* = string | seq[byte] | seq[uint8] | cstring
|
SomeLengthDelimited* = string | seq[SomeByte] | cstring
|
||||||
|
|
||||||
proc newProtoBuffer*(): ProtoBuffer =
|
proc newProtoBuffer*(): ProtoBuffer =
|
||||||
ProtoBuffer(outstream: OutputStream.init(), fieldNum: 1)
|
ProtoBuffer(outstream: OutputStream.init(), fieldNum: 1)
|
||||||
|
|
@ -156,8 +157,10 @@ proc getVarint[T: SomeVarint](
|
||||||
): T {.inline.} =
|
): T {.inline.} =
|
||||||
var bytesRead = 0
|
var bytesRead = 0
|
||||||
# Only up to 128 bits supported by the spec
|
# Only up to 128 bits supported by the spec
|
||||||
when T is enum:
|
when T is enum or T is char:
|
||||||
var value: type(ord(result))
|
var value: type(ord(result))
|
||||||
|
elif T is bool:
|
||||||
|
var value: byte
|
||||||
else:
|
else:
|
||||||
var value: T
|
var value: T
|
||||||
var shiftAmount = 0
|
var shiftAmount = 0
|
||||||
|
|
@ -176,7 +179,7 @@ proc getVarint[T: SomeVarint](
|
||||||
else:
|
else:
|
||||||
result = cast[T](value shr type(value)(1))
|
result = cast[T](value shr type(value)(1))
|
||||||
else:
|
else:
|
||||||
result = value
|
result = T(value)
|
||||||
|
|
||||||
proc decodeField*[T: SomeVarint](
|
proc decodeField*[T: SomeVarint](
|
||||||
bytes: var seq[byte],
|
bytes: var seq[byte],
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import unittest
|
import unittest
|
||||||
|
import sequtils
|
||||||
|
|
||||||
import protobuf_serialization
|
import protobuf_serialization
|
||||||
|
|
||||||
|
|
@ -9,12 +10,14 @@ type
|
||||||
Test1 = object
|
Test1 = object
|
||||||
a: uint
|
a: uint
|
||||||
b: string
|
b: string
|
||||||
|
c: char
|
||||||
|
|
||||||
Test3 = object
|
Test3 = object
|
||||||
g {.sfixed32.}: int
|
g {.sfixed32.}: int
|
||||||
h: int
|
h: int
|
||||||
i: Test1
|
i: Test1
|
||||||
j: string
|
j: string
|
||||||
|
k: bool
|
||||||
|
|
||||||
suite "Test Varint Encoding":
|
suite "Test Varint Encoding":
|
||||||
test "Can encode/decode enum field":
|
test "Can encode/decode enum field":
|
||||||
|
|
@ -52,6 +55,38 @@ suite "Test Varint Encoding":
|
||||||
assert decoded.value == num
|
assert decoded.value == num
|
||||||
assert decoded.index == 1
|
assert decoded.index == 1
|
||||||
|
|
||||||
|
test "Can encode/decode bool field":
|
||||||
|
var proto = newProtoBuffer()
|
||||||
|
let boolean = true
|
||||||
|
var bytesProcessed: int
|
||||||
|
|
||||||
|
proto.encodeField(boolean)
|
||||||
|
|
||||||
|
var output = proto.output
|
||||||
|
assert output == @[8.byte, 1]
|
||||||
|
|
||||||
|
var offset = 0
|
||||||
|
let decoded = decodeField(output, bool, offset, bytesProcessed)
|
||||||
|
assert bytesProcessed == 2
|
||||||
|
assert decoded.value == boolean
|
||||||
|
assert decoded.index == 1
|
||||||
|
|
||||||
|
test "Can encode/decode char field":
|
||||||
|
var proto = newProtoBuffer()
|
||||||
|
let charVal = 'G'
|
||||||
|
var bytesProcessed: int
|
||||||
|
|
||||||
|
proto.encodeField(charVal)
|
||||||
|
|
||||||
|
var output = proto.output
|
||||||
|
assert output == @[8.byte, ord(charVal).byte]
|
||||||
|
|
||||||
|
var offset = 0
|
||||||
|
let decoded = decodeField(output, char, offset, bytesProcessed)
|
||||||
|
assert bytesProcessed == 2
|
||||||
|
assert decoded.value == charVal
|
||||||
|
assert decoded.index == 1
|
||||||
|
|
||||||
test "Can encode/decode unsigned number field":
|
test "Can encode/decode unsigned number field":
|
||||||
var proto = newProtoBuffer()
|
var proto = newProtoBuffer()
|
||||||
let num = 123151.uint
|
let num = 123151.uint
|
||||||
|
|
@ -82,10 +117,40 @@ suite "Test Varint Encoding":
|
||||||
assert decoded.value == str
|
assert decoded.value == str
|
||||||
assert decoded.index == 1
|
assert decoded.index == 1
|
||||||
|
|
||||||
|
test "Can encode/decode char seq field":
|
||||||
|
var proto = newProtoBuffer()
|
||||||
|
let charSeq = "hey this is a string".toSeq
|
||||||
|
var bytesProcessed: int
|
||||||
|
|
||||||
|
proto.encodeField(charSeq)
|
||||||
|
|
||||||
|
var output = proto.output
|
||||||
|
assert output == @[10.byte, 20, 104, 101, 121, 32, 116, 104, 105, 115, 32, 105, 115, 32, 97, 32, 115, 116, 114, 105, 110, 103]
|
||||||
|
|
||||||
|
var offset = 0
|
||||||
|
let decoded = decodeField(output, seq[char], offset, bytesProcessed)
|
||||||
|
assert decoded.value == charSeq
|
||||||
|
assert decoded.index == 1
|
||||||
|
|
||||||
|
test "Can encode/decode uint8 seq field":
|
||||||
|
var proto = newProtoBuffer()
|
||||||
|
let uint8Seq = cast[seq[uint8]]("hey this is a string".toSeq)
|
||||||
|
var bytesProcessed: int
|
||||||
|
|
||||||
|
proto.encodeField(uint8Seq)
|
||||||
|
|
||||||
|
var output = proto.output
|
||||||
|
assert output == @[10.byte, 20, 104, 101, 121, 32, 116, 104, 105, 115, 32, 105, 115, 32, 97, 32, 115, 116, 114, 105, 110, 103]
|
||||||
|
|
||||||
|
var offset = 0
|
||||||
|
let decoded = decodeField(output, seq[uint8], offset, bytesProcessed)
|
||||||
|
assert decoded.value == uint8Seq
|
||||||
|
assert decoded.index == 1
|
||||||
|
|
||||||
test "Can encode/decode object field":
|
test "Can encode/decode object field":
|
||||||
var proto = newProtoBuffer()
|
var proto = newProtoBuffer()
|
||||||
|
|
||||||
let obj = Test3(g: 300, h: 200, i: Test1(a: 100, b: "this is a test"), j: "testing")
|
let obj = Test3(g: 300, h: 200, i: Test1(a: 100, b: "this is a test", c: 'H'), j: "testing", k: true)
|
||||||
|
|
||||||
proto.encodeField(obj)
|
proto.encodeField(obj)
|
||||||
var offset, bytesProcessed: int
|
var offset, bytesProcessed: int
|
||||||
|
|
@ -98,7 +163,7 @@ suite "Test Varint Encoding":
|
||||||
test "Can encode/decode object":
|
test "Can encode/decode object":
|
||||||
var proto = newProtoBuffer()
|
var proto = newProtoBuffer()
|
||||||
|
|
||||||
let obj = Test3(g: 300, h: 200, i: Test1(a: 100, b: "this is a test"), j: "testing")
|
let obj = Test3(g: 300, h: 200, i: Test1(a: 100, b: "this is a test", c: 'H'), j: "testing", k: true)
|
||||||
|
|
||||||
proto.encode(obj)
|
proto.encode(obj)
|
||||||
var output = proto.output
|
var output = proto.output
|
||||||
|
|
@ -108,11 +173,12 @@ suite "Test Varint Encoding":
|
||||||
test "Can encode/decode out of order object":
|
test "Can encode/decode out of order object":
|
||||||
var proto = newProtoBuffer()
|
var proto = newProtoBuffer()
|
||||||
|
|
||||||
let obj = Test3(g: 400, h: 100, i: Test1(a: 100, b: "this is a test"), j: "testing")
|
let obj = Test3(g: 400, h: 100, i: Test1(a: 100, b: "this is a test", c: 'H'), j: "testing", k: true)
|
||||||
proto.encodeField(2, 100)
|
proto.encodeField(2, 100)
|
||||||
proto.encodeField(4, "testing")
|
proto.encodeField(4, "testing")
|
||||||
proto.encodeField(1, 400)
|
proto.encodeField(1, 400)
|
||||||
proto.encodeField(3, Test1(a: 100, b: "this is a test"))
|
proto.encodeField(3, Test1(a: 100, b: "this is a test", c: 'H'))
|
||||||
|
proto.encodeField(5, true)
|
||||||
|
|
||||||
var output = proto.output
|
var output = proto.output
|
||||||
let decoded = output.decode(Test3)
|
let decoded = output.decode(Test3)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue