summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@gmail.com>2017-04-08 21:23:35 +0200
committerDominik Picheta <dominikpicheta@gmail.com>2017-04-08 21:23:35 +0200
commitcc223ff7d89a1f56d4cc0ff5b266a4e7d5d15a4d (patch)
tree7a5895bf34f9061d6125d99d83497f3a6999ffa8
parent12aafb25cc51488a99d6d73a7fd3965eb73b0bf5 (diff)
downloadNim-cc223ff7d89a1f56d4cc0ff5b266a4e7d5d15a4d.tar.gz
Support int, string and bool fields in unmarshal json macro.
-rw-r--r--lib/pure/json.nim19
-rw-r--r--tests/stdlib/tjsonmacro.nim61
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