Skip to content

Commit f290ae8

Browse files
committed
add more hooks
Signed-off-by: George Lemon <georgelemon@protonmail.com>
1 parent 2275bc8 commit f290ae8

1 file changed

Lines changed: 21 additions & 0 deletions

File tree

src/openparser/json.nim

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ proc dumpHook*(s: var string, v: JsonNode)
182182
type t[T] = tuple[a: string, b: T]
183183
proc dumpHook*[N, T](s: var string, v: array[N, t[T]])
184184
proc dumpHook*[N, T](s: var string, v: array[N, T])
185+
proc dumpHook*[T](s: var string, v: Option[T])
185186

186187
proc toJson*[T](v: T, opts: JsonOptions = nil): string =
187188
## Convert a Nim object to its JSON string representation using dump hooks.
@@ -377,6 +378,13 @@ proc dumpHook*[N, T](s: var string, v: array[N, T]) =
377378
dumpHook(s, item) # convert each item to JSON
378379
s.add("]")
379380

381+
proc dumpHook*[T](s: var string, v: Option[T]) =
382+
## Converts an Option[T] to JSON, where None is represented as null
383+
if v.isSome:
384+
dumpHook(s, v.get())
385+
else:
386+
s.add("null")
387+
380388
proc objectToJson*(v, valImpl: NimNode, opts: JsonOptions = nil): NimNode =
381389
var hasRecCase = false
382390
for field in valImpl[2]:
@@ -911,6 +919,19 @@ proc parseHook*[T](parser: var JsonParser, field: string, v: var seq[T]) =
911919
parser.walk()
912920
parser.expectSkip(tkRBracket) # end of array
913921

922+
923+
proc parseHook*[T](parser: var JsonParser, field: string, v: var Option[T]) =
924+
## A hook to parse a value wrapped in an Option type, treating null as
925+
## None and any other value as Some(value).
926+
if parser.curr.kind == tkNull:
927+
v = none(T)
928+
parser.walk()
929+
else:
930+
var tmp: T
931+
parser.parseHook("", tmp)
932+
v = some(tmp)
933+
934+
914935
#
915936
# JsonNode Objects
916937
#

0 commit comments

Comments
 (0)