diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2017-04-08 21:23:35 +0200 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@gmail.com> | 2017-04-08 21:23:35 +0200 |
commit | cc223ff7d89a1f56d4cc0ff5b266a4e7d5d15a4d (patch) | |
tree | 7a5895bf34f9061d6125d99d83497f3a6999ffa8 | |
parent | 12aafb25cc51488a99d6d73a7fd3965eb73b0bf5 (diff) | |
download | Nim-cc223ff7d89a1f56d4cc0ff5b266a4e7d5d15a4d.tar.gz |
Support int, string and bool fields in unmarshal json macro.
-rw-r--r-- | lib/pure/json.nim | 19 | ||||
-rw-r--r-- | tests/stdlib/tjsonmacro.nim | 61 |
2 files changed, 59 insertions, 21 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim index 39740300a..eca708bb7 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1442,6 +1442,24 @@ proc processType(typeName: NimNode, obj: NimNode, assert `jsonNode`.kind == JFloat; `jsonNode`.fnum ) + of "string": + result = quote do: + ( + assert `jsonNode`.kind in {JString, JNull}; + if `jsonNode`.kind == JNull: nil else: `jsonNode`.str + ) + of "int": + result = quote do: + ( + assert `jsonNode`.kind == JInt; + `jsonNode`.num.int + ) + of "bool": + result = quote do: + ( + assert `jsonNode`.kind == JBool; + `jsonNode`.bval + ) else: assert false, "Unable to process nnkSym " & $typeName else: @@ -1620,6 +1638,7 @@ when false: # To get that we shall use, obj["json"] when isMainModule: + # Note: Macro tests are in tests/stdlib/tjsonmacro.nim let testJson = parseJson"""{ "a": [1, 2, 3, 4], "b": "asd", "c": "\ud83c\udf83", "d": "\u00E6"}""" # nil passthrough diff --git a/tests/stdlib/tjsonmacro.nim b/tests/stdlib/tjsonmacro.nim index 7dbbf6b51..806cbadc6 100644 --- a/tests/stdlib/tjsonmacro.nim +++ b/tests/stdlib/tjsonmacro.nim @@ -1,3 +1,7 @@ +discard """ + file: "tjsonmacro.nim" + output: "" +""" import json, macros, strutils type @@ -17,24 +21,39 @@ type Replay* = ref object events*: seq[ReplayEvent] - -var x = Replay( - events: @[ - ReplayEvent( - time: 1.2345, - kind: FoodEaten, - foodPos: Point[float](x: 5.0, y: 1.0) - ) - ] -) - -let node = %x - -echo(node) - -let y = to(node, Replay) -doAssert y.events[0].time == 1.2345 -doAssert y.events[0].kind == FoodEaten -doAssert y.events[0].foodPos.x == 5.0 -doAssert y.events[0].foodPos.y == 1.0 -echo(y.repr) \ No newline at end of file + test: int + test2: string + test3: bool + testNil: string + +when isMainModule: + # Tests inspired by own use case (with some additional tests). + # This should succeed. + var x = Replay( + events: @[ + ReplayEvent( + time: 1.2345, + kind: FoodEaten, + foodPos: Point[float](x: 5.0, y: 1.0) + ) + ], + test: 18827361, + test2: "hello world", + test3: true, + testNil: nil + ) + + let node = %x + + let y = to(node, Replay) + doAssert y.events[0].time == 1.2345 + doAssert y.events[0].kind == FoodEaten + doAssert y.events[0].foodPos.x == 5.0 + doAssert y.events[0].foodPos.y == 1.0 + doAssert y.test == 18827361 + doAssert y.test2 == "hello world" + doAssert y.test3 + doAssert y.testNil == nil + + # Tests that verify the error messages for invalid data. + # TODO: \ No newline at end of file |