Skip to content

Commit 6ad43c6

Browse files
authored
Small refactor (#7)
1 parent 82d029a commit 6ad43c6

5 files changed

Lines changed: 28 additions & 22 deletions

File tree

README.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,16 @@ requires "cbor_serialization"
3434
Create a type and use it to encode and decode CBOR:
3535

3636
```nim
37-
import cbor_serialization, stew/[byteutils]
37+
import cbor_serialization
3838
3939
type Request = object
4040
cborrpc: string
4141
`method`: string
4242
43-
# {"cborrpc": "2.0", "method": "name"}
44-
let cbor = hexToSeqByte "0xA26763626F7272706363322E30666D6574686F64646E616D65"
45-
let decoded = Cbor.decode(cbor, Request)
43+
let encoded = Cbor.encode(Request(cborrpc: "2.0", `method`: "name"))
44+
let decoded = Cbor.decode(encoded, Request)
4645
4746
echo decoded.cborrpc
48-
echo Cbor.encode(decoded).to0xHex()
4947
```
5048

5149
## Documentation

cbor_serialization.nimble

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ description = "Flexible CBOR serialization not relying on run-time type informat
1616
license = "Apache License 2.0"
1717
skipDirs = @["tests", "fuzzer"]
1818

19-
requires "nim >= 2.0.0", "serialization", "stew >= 0.4.1", "results"
19+
requires "nim >= 2.0.0", "serialization >= 0.4.9", "stew >= 0.4.1", "results"
2020

2121
#feature "bigints":
2222
# require "bigints"

cbor_serialization/pkg/bigints.nim

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,21 @@ proc writeValue*(writer: var CborWriter, value: BigInt) {.raises: [IOError].} =
4444
if value >= 0.initBigInt:
4545
let sint = toInt[uint64](value)
4646
if sint.isSome:
47-
writer.writeValue(CborNumber(sign: CborSign.None, integer: sint.get()))
47+
writer.write(CborNumber(sign: CborSign.None, integer: sint.get()))
4848
else:
4949
var bintTag = CborTag[seq[byte]](tag: unsignedTag)
5050
toBytes(value, bintTag.val)
51-
writer.writeValue(bintTag)
51+
writer.write(bintTag)
5252
else:
5353
var bint = value.abs()
5454
dec(bint, 1)
5555
let sint = toInt[uint64](bint)
5656
if sint.isSome:
57-
writer.writeValue(CborNumber(sign: CborSign.Neg, integer: sint.get()))
57+
writer.write(CborNumber(sign: CborSign.Neg, integer: sint.get()))
5858
else:
5959
var bintTag = CborTag[seq[byte]](tag: negativeTag)
6060
toBytes(bint, bintTag.val)
61-
writer.writeValue(bintTag)
61+
writer.write(bintTag)
6262

6363
proc readValue*(
6464
reader: var CborReader, value: var BigInt

cbor_serialization/reader_impl.nim

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,11 @@ func expectedFieldsBitmask*(TT: type, fields: static int): auto {.compileTime.}
8888
proc readRecordValue*[T](
8989
r: var CborReader, value: var T
9090
) {.raises: [SerializationError, IOError].} =
91+
mixin flavorAllowsUnknownFields, flavorRequiresAllFields
9192
type
92-
ReaderType {.used.} = type r
93-
T = type value
93+
ReaderType = typeof(r)
94+
Flavor = ReaderType.Flavor
95+
T = typeof(value)
9496

9597
const
9698
fieldsTable = T.fieldReadersTable(ReaderType)
@@ -115,18 +117,18 @@ proc readRecordValue*[T](
115117
let reader = fieldsTable[fieldIdx].reader
116118
reader(value, r)
117119
encounteredFields.setBitInArray(fieldIdx)
118-
elif flavorAllowsUnknownFields(r.Flavor):
120+
elif flavorAllowsUnknownFields(Flavor):
119121
r.skipSingleValue()
120122
else:
121123
r.parser.raiseUnexpectedField(key, cstring typeName)
122124

123-
if flavorRequiresAllFields(r.Flavor) and
125+
if flavorRequiresAllFields(Flavor) and
124126
not expectedFields.isBitwiseSubsetOf(encounteredFields):
125127
r.parser.raiseIncompleteObject(typeName)
126128
else:
127129
r.parseObject(key):
128130
# avoid bloat by putting this if inside parseObject
129-
if flavorAllowsUnknownFields(r.Flavor):
131+
if flavorAllowsUnknownFields(Flavor):
130132
r.skipSingleValue()
131133
else:
132134
r.parser.raiseUnexpectedField(key, cstring typeName)

cbor_serialization/writer.nim

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ proc writeHead(
9696
else:
9797
discard
9898

99+
proc writeHead(w: var CborWriter, majorType: CborMajor) {.raises: [IOError].} =
100+
w.stream.write initialByte(majorType, cborMinorIndef)
101+
99102
func inObject(w: CborWriter): bool =
100103
w.stack.len > 0 and w.stack[^1] == CborMajor.Map
101104

@@ -137,7 +140,7 @@ proc beginObject*(w: var CborWriter, length = -1) {.raises: [IOError].} =
137140
if length >= 0:
138141
w.writeHead(CborMajor.Map, length.uint64)
139142
else:
140-
w.stream.write initialByte(CborMajor.Map, cborMinorIndef)
143+
w.writeHead(CborMajor.Map)
141144

142145
w.wantName = true
143146
w.stack.add CborMajor.Map
@@ -161,7 +164,7 @@ proc beginArray*(w: var CborWriter, length = -1) {.raises: [IOError].} =
161164
if length >= 0:
162165
w.writeHead(CborMajor.Array, length.uint64)
163166
else:
164-
w.stream.write initialByte(CborMajor.Array, cborMinorIndef)
167+
w.writeHead(CborMajor.Array)
165168

166169
w.stack.add CborMajor.Array
167170

@@ -191,7 +194,7 @@ proc beginStringLike(
191194
w.writeHead(kind, length.uint64)
192195
w.wantBytes = true
193196
else:
194-
w.stream.write initialByte(kind, cborMinorIndef)
197+
w.writeHead(kind)
195198
w.wantBytesElm = true
196199

197200
w.stack.add kind
@@ -305,11 +308,11 @@ proc write*(w: var CborWriter, val: SomeFloat) {.raises: [IOError].} =
305308
w.streamElement(s):
306309
case val.classify
307310
of fcNan:
308-
s.write [initialByte(CborMajor.SimpleOrFloat, cborMinorLen2), 0x7E'u8, 0x00'u8]
311+
w.writeHead(CborMajor.SimpleOrFloat, 0x7E00'u16)
309312
of fcInf:
310-
s.write [initialByte(CborMajor.SimpleOrFloat, cborMinorLen2), 0x7C'u8, 0x00'u8]
313+
w.writeHead(CborMajor.SimpleOrFloat, 0x7C00'u16)
311314
of fcNegInf:
312-
s.write [initialByte(CborMajor.SimpleOrFloat, cborMinorLen2), 0xFC'u8, 0x00'u8]
315+
w.writeHead(CborMajor.SimpleOrFloat, 0xFC00'u16)
313316
else:
314317
# VM requires this cast dance because float32 has 64-bit precision
315318
#if val == float32(val):
@@ -437,13 +440,16 @@ proc writeRecordValue*(w: var CborWriter, value: object | tuple) {.raises: [IOEr
437440
discard fieldName
438441
w.endObject(stopCode = false)
439442

440-
proc writeValue*(w: var CborWriter, value: CborNumber) {.raises: [IOError].} =
443+
proc write*(w: var CborWriter, value: CborNumber) {.raises: [IOError].} =
441444
w.streamElement(_):
442445
if value.sign == CborSign.Neg:
443446
w.writeHead(CborMajor.Negative, value.integer)
444447
else:
445448
w.writeHead(CborMajor.Unsigned, value.integer)
446449

450+
proc writeValue*(w: var CborWriter, value: CborNumber) {.raises: [IOError].} =
451+
w.write(value)
452+
447453
proc writeValue*(w: var CborWriter, value: CborObjectType) {.raises: [IOError].} =
448454
var fieldCount = 0
449455
for _, v in value:

0 commit comments

Comments
 (0)