summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@gmail.com>2017-11-29 20:30:40 +0000
committerDominik Picheta <dominikpicheta@googlemail.com>2017-11-30 21:34:30 +0000
commit8187e83645bbc9d536eebfab2af3b2437c3485fb (patch)
tree3b1a8c8c2043799da89db5fd656d13a1a6d932d5 /lib
parent8ca41ce637106c734cd819a1f49606db880cf075 (diff)
downloadNim-8187e83645bbc9d536eebfab2af3b2437c3485fb.tar.gz
Implement Table/OrderedTable support for json.to macro.
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/json.nim24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index b057aa7c6..6153e2f03 100644
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -1677,6 +1677,30 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode =
         (
           if `lenientJsonNode`.isNil: `workaround`[`optionGeneric`]() else: some[`optionGeneric`](`value`)
         )
+    of "table", "orderedtable":
+      let tableKeyType = typeSym[1]
+      if ($tableKeyType).cmpIgnoreStyle("string") != 0:
+        error("JSON doesn't support keys of type " & $tableKeyType)
+      let tableValueType = typeSym[2]
+
+      let forLoopKey = genSym(nskForVar, "key")
+      let indexerNode = createJsonIndexer(jsonNode, forLoopKey)
+      let constructorNode = createConstructor(tableValueType, indexerNode)
+
+      let tableInit =
+        if bracketName == "table":
+          bindSym("initTable")
+        else:
+          bindSym("initOrderedTable")
+
+      # Create a statement expression containing a for loop.
+      result = quote do:
+        (
+          var map = `tableInit`[`tableKeyType`, `tableValueType`]();
+          verifyJsonKind(`jsonNode`, {JObject}, astToStr(`jsonNode`));
+          for `forLoopKey` in keys(`jsonNode`.fields): map[`forLoopKey`] = `constructorNode`;
+          map
+        )
     of "ref":
       # Ref type.
       var typeName = $typeSym[1]