diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2017-11-29 20:30:40 +0000 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2017-11-30 21:34:30 +0000 |
commit | 8187e83645bbc9d536eebfab2af3b2437c3485fb (patch) | |
tree | 3b1a8c8c2043799da89db5fd656d13a1a6d932d5 /lib | |
parent | 8ca41ce637106c734cd819a1f49606db880cf075 (diff) | |
download | Nim-8187e83645bbc9d536eebfab2af3b2437c3485fb.tar.gz |
Implement Table/OrderedTable support for json.to macro.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/json.nim | 24 |
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] |