Support all int, uint and float variants in json.to macro.
This commit is contained in:
parent
2bb2e6975e
commit
578ab935cb
2 changed files with 43 additions and 15 deletions
|
|
@ -1609,25 +1609,14 @@ proc processType(typeName: NimNode, obj: NimNode,
|
||||||
`getEnumCall`
|
`getEnumCall`
|
||||||
)
|
)
|
||||||
of nnkSym:
|
of nnkSym:
|
||||||
case ($typeName).normalize
|
let name = ($typeName).normalize
|
||||||
of "float":
|
case name
|
||||||
result = quote do:
|
|
||||||
(
|
|
||||||
verifyJsonKind(`jsonNode`, {JFloat, JInt}, astToStr(`jsonNode`));
|
|
||||||
if `jsonNode`.kind == JFloat: `jsonNode`.fnum else: `jsonNode`.num.float
|
|
||||||
)
|
|
||||||
of "string":
|
of "string":
|
||||||
result = quote do:
|
result = quote do:
|
||||||
(
|
(
|
||||||
verifyJsonKind(`jsonNode`, {JString, JNull}, astToStr(`jsonNode`));
|
verifyJsonKind(`jsonNode`, {JString, JNull}, astToStr(`jsonNode`));
|
||||||
if `jsonNode`.kind == JNull: nil else: `jsonNode`.str
|
if `jsonNode`.kind == JNull: nil else: `jsonNode`.str
|
||||||
)
|
)
|
||||||
of "int":
|
|
||||||
result = quote do:
|
|
||||||
(
|
|
||||||
verifyJsonKind(`jsonNode`, {JInt}, astToStr(`jsonNode`));
|
|
||||||
`jsonNode`.num.int
|
|
||||||
)
|
|
||||||
of "biggestint":
|
of "biggestint":
|
||||||
result = quote do:
|
result = quote do:
|
||||||
(
|
(
|
||||||
|
|
@ -1641,7 +1630,20 @@ proc processType(typeName: NimNode, obj: NimNode,
|
||||||
`jsonNode`.bval
|
`jsonNode`.bval
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
doAssert false, "Unable to process nnkSym " & $typeName
|
if name.startsWith("int") or name.startsWith("uint"):
|
||||||
|
result = quote do:
|
||||||
|
(
|
||||||
|
verifyJsonKind(`jsonNode`, {JInt}, astToStr(`jsonNode`));
|
||||||
|
`jsonNode`.num.`obj`
|
||||||
|
)
|
||||||
|
elif name.startsWith("float"):
|
||||||
|
result = quote do:
|
||||||
|
(
|
||||||
|
verifyJsonKind(`jsonNode`, {JInt, JFloat}, astToStr(`jsonNode`));
|
||||||
|
if `jsonNode`.kind == JFloat: `jsonNode`.fnum.`obj` else: `jsonNode`.num.`obj`
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
doAssert false, "Unable to process nnkSym " & $typeName
|
||||||
else:
|
else:
|
||||||
doAssert false, "Unable to process type: " & $obj.kind
|
doAssert false, "Unable to process type: " & $obj.kind
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -354,4 +354,30 @@ when isMainModule:
|
||||||
let dataDeser = to(dataParsed, Test)
|
let dataDeser = to(dataParsed, Test)
|
||||||
doAssert dataDeser.name == "FooBar"
|
doAssert dataDeser.name == "FooBar"
|
||||||
doAssert dataDeser.fallback.kind == JFloat
|
doAssert dataDeser.fallback.kind == JFloat
|
||||||
doAssert dataDeser.fallback.getFloat() == 56.42
|
doAssert dataDeser.fallback.getFloat() == 56.42
|
||||||
|
|
||||||
|
# int64, float64 etc support.
|
||||||
|
block:
|
||||||
|
type
|
||||||
|
Test1 = object
|
||||||
|
a: int8
|
||||||
|
b: int16
|
||||||
|
c: int32
|
||||||
|
d: int64
|
||||||
|
e: uint8
|
||||||
|
f: uint16
|
||||||
|
g: uint32
|
||||||
|
h: uint64
|
||||||
|
i: float32
|
||||||
|
j: float64
|
||||||
|
|
||||||
|
let data = """
|
||||||
|
{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5, "f": 6, "g": 7,
|
||||||
|
"h": 8, "i": 9.9, "j": 10.10}
|
||||||
|
"""
|
||||||
|
|
||||||
|
let dataParsed = parseJson(data)
|
||||||
|
let dataDeser = to(dataParsed, Test1)
|
||||||
|
doAssert dataDeser.a == 1
|
||||||
|
doAssert dataDeser.f == 6
|
||||||
|
doAssert dataDeser.i == 9.9'f32
|
||||||
Loading…
Add table
Add a link
Reference in a new issue