1- import jsony/ objvar, strutils, tables, sets, unicode, json, options, parseutils, typetraits
1+ import jsony/ objvar, std/ json, std/ options, std/ parseutils, std/ sets,
2+ std/ strutils, std/ tables, std/ typetraits, std/ unicode
23
34type JsonError * = object of ValueError
45
@@ -10,6 +11,7 @@ when defined(release):
1011type
1112 SomeTable * [K, V] = Table [K, V] | OrderedTable [K, V] |
1213 TableRef [K, V] | OrderedTableRef [K, V]
14+ RawJson * = distinct string
1315
1416proc parseHook * [T](s: string , i: var int , v: var seq [T])
1517proc parseHook * [T: enum ](s: string , i: var int , v: var T)
@@ -73,10 +75,19 @@ proc parseHook*(s: string, i: var int, v: var bool) =
7375 else :
7476 # Its faster to do char by char scan:
7577 eatSpace (s, i)
76- if i + 3 < s.len and s[i+ 0 ] == 't' and s[i+ 1 ] == 'r' and s[i+ 2 ] == 'u' and s[i+ 3 ] == 'e' :
78+ if i + 3 < s.len and
79+ s[i+ 0 ] == 't' and
80+ s[i+ 1 ] == 'r' and
81+ s[i+ 2 ] == 'u' and
82+ s[i+ 3 ] == 'e' :
7783 i += 4
7884 v = true
79- elif i + 4 < s.len and s[i+ 0 ] == 'f' and s[i+ 1 ] == 'a' and s[i+ 2 ] == 'l' and s[i+ 3 ] == 's' and s[i+ 4 ] == 'e' :
85+ elif i + 4 < s.len and
86+ s[i+ 0 ] == 'f' and
87+ s[i+ 1 ] == 'a' and
88+ s[i+ 2 ] == 'l' and
89+ s[i+ 3 ] == 's' and
90+ s[i+ 4 ] == 'e' :
8091 i += 5
8192 v = false
8293 else :
@@ -234,7 +245,11 @@ proc parseStringFast(s: string, i: var int, v: var string) =
234245proc parseHook * (s: string , i: var int , v: var string ) =
235246 # # Parse string.
236247 eatSpace (s, i)
237- if i + 3 < s.len and s[i+ 0 ] == 'n' and s[i+ 1 ] == 'u' and s[i+ 2 ] == 'l' and s[i+ 3 ] == 'l' :
248+ if i + 3 < s.len and
249+ s[i+ 0 ] == 'n' and
250+ s[i+ 1 ] == 'u' and
251+ s[i+ 2 ] == 'l' and
252+ s[i+ 3 ] == 'l' :
238253 i += 4
239254 return
240255 eatChar (s, i, '"' )
@@ -284,7 +299,11 @@ proc parseHook*[T: array](s: string, i: var int, v: var T) =
284299
285300proc parseHook * [T: not object ](s: string , i: var int , v: var ref T) =
286301 eatSpace (s, i)
287- if i + 3 < s.len and s[i+ 0 ] == 'n' and s[i+ 1 ] == 'u' and s[i+ 2 ] == 'l' and s[i+ 3 ] == 'l' :
302+ if i + 3 < s.len and
303+ s[i+ 0 ] == 'n' and
304+ s[i+ 1 ] == 'u' and
305+ s[i+ 2 ] == 'l' and
306+ s[i+ 3 ] == 'l' :
288307 i += 4
289308 return
290309 new (v)
@@ -406,7 +425,11 @@ proc parseHook*[T: enum](s: string, i: var int, v: var T) =
406425proc parseHook * [T: object | ref object ](s: string , i: var int , v: var T) =
407426 # # Parse an object or ref object.
408427 eatSpace (s, i)
409- if i + 3 < s.len and s[i+ 0 ] == 'n' and s[i+ 1 ] == 'u' and s[i+ 2 ] == 'l' and s[i+ 3 ] == 'l' :
428+ if i + 3 < s.len and
429+ s[i+ 0 ] == 'n' and
430+ s[i+ 1 ] == 'u' and
431+ s[i+ 2 ] == 'l' and
432+ s[i+ 3 ] == 'l' :
410433 i += 4
411434 return
412435 eatChar (s, i, '{' )
@@ -448,7 +471,11 @@ proc parseHook*[T: object|ref object](s: string, i: var int, v: var T) =
448471proc parseHook * [T](s: string , i: var int , v: var Option [T]) =
449472 # # Parse an Option.
450473 eatSpace (s, i)
451- if i + 3 < s.len and s[i+ 0 ] == 'n' and s[i+ 1 ] == 'u' and s[i+ 2 ] == 'l' and s[i+ 3 ] == 'l' :
474+ if i + 3 < s.len and
475+ s[i+ 0 ] == 'n' and
476+ s[i+ 1 ] == 'u' and
477+ s[i+ 2 ] == 'l' and
478+ s[i+ 3 ] == 'l' :
452479 i += 4
453480 return
454481 var e: T
@@ -575,7 +602,7 @@ proc dumpHook*(s: var string, v: string)
575602proc dumpHook * (s: var string , v: char )
576603proc dumpHook * (s: var string , v: tuple )
577604proc dumpHook * (s: var string , v: enum )
578- type t[T] = tuple [a:string , b:T]
605+ type t[T] = tuple [a: string , b: T]
579606proc dumpHook * [N, T](s: var string , v: array [N, t[T]])
580607proc dumpHook * [N, T](s: var string , v: array [N, T])
581608proc dumpHook * [T](s: var string , v: seq [T])
@@ -842,6 +869,14 @@ proc dumpHook*(s: var string, v: JsonNode) =
842869 of JBool :
843870 s.dumpHook (v.getBool)
844871
872+ proc parseHook * (s: string , i: var int , v: var RawJson ) =
873+ let oldI = i
874+ skipValue (s, i)
875+ v = s[oldI ..< i].RawJson
876+
877+ proc dumpHook * (s: var string , v: RawJson ) =
878+ s.add v.string
879+
845880proc toJson * [T](v: T): string =
846881 dumpHook (result , v)
847882
@@ -860,6 +895,5 @@ template toStaticJson*(v: untyped): static[string] =
860895# const s = v.toJsonDynamic()
861896# s
862897
863-
864898when defined (release):
865899 {.pop .}
0 commit comments