fixes #21638; fromJson should support empty objects (#21641)

* fixes #21638; `fromJson` should supports empty objects

* complete the logic

(cherry picked from commit 5e016e4466)
This commit is contained in:
ringabout
2023-04-11 12:38:30 +08:00
committed by narimiran
parent ed21e84f46
commit 6f05abf21c
2 changed files with 21 additions and 11 deletions

View File

@@ -89,19 +89,24 @@ macro getDiscriminants(a: typedesc): seq[string] =
let sym = a[1]
let t = sym.getTypeImpl
let t2 = t[2]
doAssert t2.kind == nnkRecList
result = newTree(nnkBracket)
for ti in t2:
if ti.kind == nnkRecCase:
let key = ti[0][0]
let typ = ti[0][1]
result.add newLit key.strVal
if result.len > 0:
case t2.kind
of nnkEmpty: # allow empty objects
result = quote do:
@`result`
seq[string].default
of nnkRecList:
result = newTree(nnkBracket)
for ti in t2:
if ti.kind == nnkRecCase:
let key = ti[0][0]
result.add newLit key.strVal
if result.len > 0:
result = quote do:
@`result`
else:
result = quote do:
seq[string].default
else:
result = quote do:
seq[string].default
doAssert false, "unexpected kind: " & $t2.kind
macro initCaseObject(T: typedesc, fun: untyped): untyped =
## does the minimum to construct a valid case object, only initializing