diff --git a/rlp.nim b/rlp.nim index 3968897..c7ca633 100644 --- a/rlp.nim +++ b/rlp.nim @@ -279,9 +279,17 @@ proc read*[E](rlp: var Rlp, T: typedesc[seq[E]]): T = for elem in rlp: result.add rlp.read(E) -proc read*(rlp: var Rlp, T: typedesc[object|tuple]): T = +proc read*(rlp: var Rlp, T: typedesc[object|tuple], + wrappedInList = wrapObjectsInList): T = mixin enumerateRlpFields, read + if wrappedInList: + var + payloadOffset = rlp.payloadOffset() + payloadEnd = rlp.position + payloadOffset + rlp.payloadBytesCount() + + rlp.position += payloadOffset + template op(field) = field = rlp.read(type(field)) @@ -306,7 +314,7 @@ proc decode*(bytes: openarray[byte]): RlpNode = bytesCopy = @bytes rlp = rlpFromBytes initBytesRange(bytesCopy) return rlp.toNodes - + template decode*(bytes: BytesRange, T: typedesc): untyped = var rlp = rlpFromBytes bytes diff --git a/rlp/writer.nim b/rlp/writer.nim index e508928..eda5069 100644 --- a/rlp/writer.nim +++ b/rlp/writer.nim @@ -25,6 +25,9 @@ type Integer* = SomeOrdinal or IntLike or uint or uint64 +const + wrapObjectsInList* = true + proc bytesNeeded(num: Integer): int = var n = num while n != 0: @@ -172,8 +175,15 @@ proc append*[T](self; list: seq[T]) = for i in 0 ..< list.len: self.append list[i] -proc append*(self; data: object|tuple) = +proc append*(self; data: object|tuple, wrapInList = wrapObjectsInList) = mixin enumerateRlpFields, append + + if wrapInList: + var fieldsCount = 0 + template countFields(x) = inc fieldsCount + enumerateRlpFields(data, countFields) + self.startList(fieldsCount) + template op(x) = append(self, x) enumerateRlpFields(data, op) diff --git a/tests/test_object_serialization.nim b/tests/test_object_serialization.nim index f42ff9e..35922bc 100644 --- a/tests/test_object_serialization.nim +++ b/tests/test_object_serialization.nim @@ -30,7 +30,6 @@ test "encoding and decoding an object": f: Foo(x: 5'u64, y: "hocus pocus", z: @[100, 200, 300])) var bytes = encode(originalBar) - var r = rlpFromBytes(bytes) var restoredBar = r.read(Bar)