summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@gmail.com>2017-05-17 16:11:26 +0100
committerDominik Picheta <dominikpicheta@gmail.com>2017-05-17 16:11:26 +0100
commitd1daccac2f9b9885f9c70ce52c10156d8b13b29c (patch)
tree19e4b6adf670092d8b3a7911393f02b161133013 /lib
parent427aa2d395f61367c4d29aa231e31d5c10f5ab4f (diff)
downloadNim-d1daccac2f9b9885f9c70ce52c10156d8b13b29c.tar.gz
Fixes #5761.
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/json.nim21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index 564f952d3..6780ca164 100644
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -1608,7 +1608,7 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode =
       result = processType(newIdentNode(typeName), obj, jsonNode, true)
     of "seq":
       let seqT = typeSym[1]
-      let forLoopI = newIdentNode("i")
+      let forLoopI = genSym(nskForVar, "i")
       let indexerNode = createJsonIndexer(jsonNode, forLoopI)
       let constructorNode = createConstructor(seqT, indexerNode)
 
@@ -1616,12 +1616,25 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode =
       result = quote do:
         (
           var list: `typeSym` = @[];
-          # if `jsonNode`.kind != JArray:
-          #   # TODO: Improve error message.
-          #   raise newException(ValueError, "Expected a list")
+          verifyJsonKind(`jsonNode`, {JArray}, astToStr(`jsonNode`));
           for `forLoopI` in 0 .. <`jsonNode`.len: list.add(`constructorNode`);
           list
         )
+    of "array":
+      let arrayT = typeSym[2]
+      let forLoopI = genSym(nskForVar, "i")
+      let indexerNode = createJsonIndexer(jsonNode, forLoopI)
+      let constructorNode = createConstructor(arrayT, indexerNode)
+
+      # Create a statement expression containing a for loop.
+      result = quote do:
+        (
+          var list: `typeSym`;
+          verifyJsonKind(`jsonNode`, {JArray}, astToStr(`jsonNode`));
+          for `forLoopI` in 0 .. <`jsonNode`.len: list[`forLoopI`] =`constructorNode`;
+          list
+        )
+
     else:
       # Generic type.
       let obj = getType(typeSym)