jsonutils: support set (#17994)

This commit is contained in:
Timothee Cour 2021-05-11 12:09:17 -07:00 • committed by GitHub
commit a770c98e27
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 5 deletions

View file

@ -110,16 +110,16 @@
- Added `BackwardsIndex` overload for `JsonNode`. - Added `BackwardsIndex` overload for `JsonNode`.
- added `jsonutils.jsonTo` overload with `opt = Joptions()` param.
- `json.%`,`json.to`, `jsonutils.formJson`,`jsonutils.toJson` now work with `uint|uint64` - `json.%`,`json.to`, `jsonutils.formJson`,`jsonutils.toJson` now work with `uint|uint64`
instead of raising (as in 1.4) or giving wrong results (as in 1.2). instead of raising (as in 1.4) or giving wrong results (as in 1.2).
- added `jsonutils.jsonTo` overload with `opt = Joptions()` param.
- `jsonutils` now handles `cstring` (including as Table key), and `set`.
- Added an overload for the `collect` macro that inferes the container type based - Added an overload for the `collect` macro that inferes the container type based
on the syntax of the last expression. Works with std seqs, tables and sets. on the syntax of the last expression. Works with std seqs, tables and sets.
- `jsonutils` now handles `cstring` (including as Table key).
- Added `randState` template that exposes the default random number generator. - Added `randState` template that exposes the default random number generator.
Useful for library authors. Useful for library authors.

View file

@ -214,6 +214,10 @@ proc fromJson*[T](a: var T, b: JsonNode, opt = Joptions()) =
for ai in mitems(a): for ai in mitems(a):
fromJson(ai, b[i], opt) fromJson(ai, b[i], opt)
i.inc i.inc
elif T is set:
type E = typeof(for ai in a: ai)
for val in b.getElems:
incl a, jsonTo(val, E)
elif T is seq: elif T is seq:
a.setLen b.len a.setLen b.len
for i, val in b.getElems: for i, val in b.getElems:
@ -268,7 +272,7 @@ proc toJson*[T](a: T): JsonNode =
elif T is ref | ptr: elif T is ref | ptr:
if system.`==`(a, nil): result = newJNull() if system.`==`(a, nil): result = newJNull()
else: result = toJson(a[]) else: result = toJson(a[])
elif T is array | seq: elif T is array | seq | set:
result = newJArray() result = newJArray()
for ai in a: result.add toJson(ai) for ai in a: result.add toJson(ai)
elif T is pointer: result = toJson(cast[int](a)) elif T is pointer: result = toJson(cast[int](a))

View file

@ -70,6 +70,12 @@ template fn() =
doAssert b2.ord == 1 # explains the `1` doAssert b2.ord == 1 # explains the `1`
testRoundtrip(a): """[1,2,3]""" testRoundtrip(a): """[1,2,3]"""
block: # set
type Foo = enum f1, f2, f3, f4, f5
# type Goo = enum g1 = 10, g2 = 15, g3 = 17, g4 # in future PR, elements for holey enum should be treated as enum, not string
let a = ({f1, f3}, {1'u8, 7'u8}, {'0'..'9'}, {123'u16, 456, 789, 1121, 1122, 1542})
testRoundtrip(a): """[[0,2],[1,7],[48,49,50,51,52,53,54,55,56,57],[123,456,789,1121,1122,1542]]"""
block: # bug #17383 block: # bug #17383
block: block:
let a = (int32.high, uint32.high) let a = (int32.high, uint32.high)