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
2
3
3
4
type JsonError* = object of ValueError
4
5
@@ -10,6 +11,7 @@ when defined(release):
10
11
type
11
12
SomeTable* [K, V] = Table[K, V] | OrderedTable[K, V] |
12
13
TableRef[K, V] | OrderedTableRef[K, V]
14
+ RawJson* = distinct string
13
15
14
16
proc parseHook* [T](s: string , i: var int , v: var seq [T])
15
17
proc 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) =
73
75
else :
74
76
# Its faster to do char by char scan:
75
77
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' :
77
83
i += 4
78
84
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' :
80
91
i += 5
81
92
v = false
82
93
else :
@@ -234,7 +245,11 @@ proc parseStringFast(s: string, i: var int, v: var string) =
234
245
proc parseHook* (s: string , i: var int , v: var string ) =
235
246
# # Parse string.
236
247
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' :
238
253
i += 4
239
254
return
240
255
eatChar(s, i, '"' )
@@ -284,7 +299,11 @@ proc parseHook*[T: array](s: string, i: var int, v: var T) =
284
299
285
300
proc parseHook* [T: not object ](s: string , i: var int , v: var ref T) =
286
301
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' :
288
307
i += 4
289
308
return
290
309
new(v)
@@ -406,7 +425,11 @@ proc parseHook*[T: enum](s: string, i: var int, v: var T) =
406
425
proc parseHook*[T: object|ref object](s: string , i: var int , v: var T) =
407
426
## Parse an object or ref object.
408
427
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' :
410
433
i += 4
411
434
return
412
435
eatChar(s, i, '{' )
@@ -448,7 +471,11 @@ proc parseHook*[T: object|ref object](s: string, i: var int, v: var T) =
448
471
proc parseHook* [T](s: string , i: var int , v: var Option[T]) =
449
472
## Parse an Option.
450
473
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' :
452
479
i += 4
453
480
return
454
481
var e: T
@@ -575,7 +602,7 @@ proc dumpHook*(s: var string, v: string)
575
602
proc dumpHook*(s: var string , v: char )
576
603
proc dumpHook*(s: var string , v: tuple)
577
604
proc dumpHook*(s: var string , v: enum)
578
- type t[T] = tuple[a:string , b:T]
605
+ type t[T] = tuple[a: string , b: T]
579
606
proc dumpHook*[N, T](s: var string , v: array [N, t[T]])
580
607
proc dumpHook*[N, T](s: var string , v: array [N, T])
581
608
proc dumpHook*[T](s: var string , v: seq [T])
@@ -842,6 +869,14 @@ proc dumpHook*(s: var string, v: JsonNode) =
842
869
of JBool:
843
870
s.dumpHook(v.getBool)
844
871
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
+
845
880
proc toJson* [T](v: T): string =
846
881
dumpHook(result , v)
847
882
@@ -860,6 +895,5 @@ template toStaticJson*(v: untyped): static[string] =
860
895
# const s = v.toJsonDynamic()
861
896
# s
862
897
863
-
864
898
when defined(release):
865
899
{.pop.}
0 commit comments