diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2017-05-17 16:11:26 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@gmail.com> | 2017-05-17 16:11:26 +0100 |
commit | d1daccac2f9b9885f9c70ce52c10156d8b13b29c (patch) | |
tree | 19e4b6adf670092d8b3a7911393f02b161133013 /lib | |
parent | 427aa2d395f61367c4d29aa231e31d5c10f5ab4f (diff) | |
download | Nim-d1daccac2f9b9885f9c70ce52c10156d8b13b29c.tar.gz |
Fixes #5761.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/json.nim | 21 |
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) |