diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2017-11-29 19:15:25 +0000 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2017-11-30 21:34:30 +0000 |
commit | 8ca41ce637106c734cd819a1f49606db880cf075 (patch) | |
tree | fe0b2d445d834c6c1b9d102632847847d2ce3fda /lib | |
parent | d3c9b58c005e7cd537cbdf3dfd3f69e72fa40722 (diff) | |
download | Nim-8ca41ce637106c734cd819a1f49606db880cf075.tar.gz |
Implement support for Option[T] in json.to macro. Fixes #5848.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/json.nim | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim index 90cf7b8c9..b057aa7c6 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1346,6 +1346,16 @@ proc createJsonIndexer(jsonNode: NimNode, indexNode ) +proc transformJsonIndexer(jsonNode: NimNode): NimNode = + case jsonNode.kind + of nnkBracketExpr: + result = newNimNode(nnkCurlyExpr) + else: + result = jsonNode.copy() + + for child in jsonNode: + result.add(transformJsonIndexer(child)) + template verifyJsonKind(node: JsonNode, kinds: set[JsonNodeKind], ast: string) = if node.kind notin kinds: @@ -1637,6 +1647,10 @@ proc processType(typeName: NimNode, obj: NimNode, doAssert(not result.isNil(), "processType not initialised.") +import options +proc workaroundMacroNone[T](): Option[T] = + none(T) + proc createConstructor(typeSym, jsonNode: NimNode): NimNode = ## Accepts a type description, i.e. "ref Type", "seq[Type]", "Type" etc. ## @@ -1650,6 +1664,19 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode = of nnkBracketExpr: var bracketName = ($typeSym[0]).normalize case bracketName + of "option": + # TODO: Would be good to verify that this is Option[T] from + # options module I suppose. + let lenientJsonNode = transformJsonIndexer(jsonNode) + + let optionGeneric = typeSym[1] + let value = createConstructor(typeSym[1], jsonNode) + let workaround = bindSym("workaroundMacroNone") # TODO: Nim Bug: This shouldn't be necessary. + + result = quote do: + ( + if `lenientJsonNode`.isNil: `workaround`[`optionGeneric`]() else: some[`optionGeneric`](`value`) + ) of "ref": # Ref type. var typeName = $typeSym[1] |