Implement support for normal and ordered tables

This commit is contained in:
Alexander Ivanov 2019-08-02 13:25:02 +03:00 committed by zah
parent 342a272281
commit e49b8bdb43
3 changed files with 39 additions and 1 deletions

View File

@ -110,6 +110,7 @@ proc allocPtr[T](p: var ptr T) =
proc allocPtr[T](p: var ref T) =
p = new(T)
iterator readArray*(r: var JsonReader, ElemType: typedesc): ElemType =
mixin readValue
@ -123,6 +124,23 @@ iterator readArray*(r: var JsonReader, ElemType: typedesc): ElemType =
r.lexer.next()
r.skipToken tkBracketRi
iterator readObject*(r: var JsonReader, KeyType: typedesc, ValueType: typedesc): (KeyType, ValueType) =
mixin readValue
r.skipToken tkCurlyLe
if r.lexer.tok != tkCurlyRi:
while true:
var key: KeyType
var value: ValueType
readValue(r, key)
if r.lexer.tok != tkColon: break
r.lexer.next()
readValue(r, value)
yield (key, value)
if r.lexer.tok != tkComma: break
r.lexer.next()
r.skipToken tkCurlyRi
proc readValue*(r: var JsonReader, value: var auto) =
mixin readValue

View File

@ -0,0 +1,20 @@
import stew/shims/tables, ../../json_serialization/[reader, writer, lexer]
export tables
type
TableType = OrderedTable | Table
proc writeValue*(writer: var JsonWriter, value: TableType) =
writer.beginRecord()
for key, val in value:
writer.writeField key, val
writer.endRecord()
proc readValue*(reader: var JsonReader, value: var TableType) =
type KeyType = type(value.keys)
type ValueType = type(value.values)
value = init TableType
for (key, val) in readObject(reader, KeyType, ValueType):
value[key] = val

View File

@ -3,7 +3,7 @@ import
serialization/object_serialization,
serialization/testing/generic_suite,
../json_serialization, ./utils,
../json_serialization/std/[options, sets]
../json_serialization/std/[options, sets, tables]
type
Foo = object