Skip to content

Commit c272caf

Browse files
committed
Add support for ref ints, ref enums etc...
1 parent 177a618 commit c272caf

File tree

4 files changed

+118
-4
lines changed

4 files changed

+118
-4
lines changed

src/jsony.nim

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ proc parseHook*[T](s: string, i: var int, v: var SomeTable[string, T])
1717
proc parseHook*[T](s: string, i: var int, v: var SomeSet[T])
1818
proc parseHook*[T: tuple](s: string, i: var int, v: var T)
1919
proc parseHook*[T: array](s: string, i: var int, v: var T)
20-
proc parseHook*[T: ref array](s: string, i: var int, v: var T)
20+
proc parseHook*[T: not object](s: string, i: var int, v: var ref T)
2121
proc parseHook*(s: string, i: var int, v: var JsonNode)
2222
proc parseHook*(s: string, i: var int, v: var char)
2323

@@ -280,7 +280,7 @@ proc parseHook*[T: array](s: string, i: var int, v: var T) =
280280
inc i
281281
eatChar(s, i, ']')
282282

283-
proc parseHook*[T: ref array](s: string, i: var int, v: var T) =
283+
proc parseHook*[T: not object](s: string, i: var int, v: var ref T) =
284284
eatSpace(s, i)
285285
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':
286286
i += 4
@@ -548,7 +548,7 @@ proc dumpHook*(s: var string, v: enum)
548548
proc dumpHook*[N, T](s: var string, v: array[N, T])
549549
proc dumpHook*[T](s: var string, v: seq[T])
550550
proc dumpHook*(s: var string, v: object)
551-
proc dumpHook*(s: var string, v: ref object)
551+
proc dumpHook*(s: var string, v: ref)
552552

553553
proc dumpHook*(s: var string, v: bool) =
554554
if v:
@@ -739,7 +739,7 @@ proc dumpHook*(s: var string, v: object) =
739739
inc i
740740
s.add '}'
741741

742-
proc dumpHook*(s: var string, v: ref object) =
742+
proc dumpHook*(s: var string, v: ref) =
743743
if v == nil:
744744
s.add "null"
745745
else:

tests/all.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ import test_strings
1717
import test_tables
1818
import test_tojson
1919
import test_tuples
20+
import test_refs
2021

2122
echo "all tests pass"

tests/test_quirkydump.nim

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import jsony, options
2+
3+
type
4+
Bar = ref object
5+
nameOfThing: string
6+
arr: seq[int]
7+
8+
Foo = ref object
9+
idRef: string
10+
bar1Object: Option[Bar]
11+
bar2Object: Option[Bar]
12+
13+
proc camel2snake*(s: string): string =
14+
## CanBeFun => can_be_fun
15+
## https://forum.nim-lang.org/t/1701
16+
result = newStringOfCap(s.len)
17+
for i in 0..<len(s):
18+
if s[i] in {'A'..'Z'}:
19+
if i > 0:
20+
result.add('_')
21+
result.add(chr(ord(s[i]) + (ord('a') - ord('A'))))
22+
else:
23+
result.add(s[i])
24+
25+
template dumpKey(s: var string, v: string) =
26+
const v2 = v.camel2snake().toJson() & ":"
27+
s.add v2
28+
29+
proc dumpHook*(s: var string, v: object) =
30+
s.add '{'
31+
var i = 0
32+
when compiles(for k, e in v.pairs: discard):
33+
# Tables and table like objects.
34+
for k, e in v.pairs:
35+
if i > 0:
36+
s.add ','
37+
s.dumpHook(k)
38+
s.add ':'
39+
s.dumpHook(e)
40+
inc i
41+
else:
42+
# Normal objects.
43+
for k, e in v.fieldPairs:
44+
when compiles(e.isSome):
45+
if e.isSome:
46+
if i > 0:
47+
s.add ','
48+
s.dumpKey(k)
49+
s.dumpHook(e)
50+
inc i
51+
else:
52+
if i > 0:
53+
s.add ','
54+
s.dumpKey(k)
55+
s.dumpHook(e)
56+
inc i
57+
s.add '}'
58+
59+
var foo = Foo(
60+
idRef: "0000-1234",
61+
bar1Object: some(Bar(nameOfThing:"Bar", arr: @[1, 2, 3]))
62+
)
63+
64+
echo foo.toJson()

tests/test_refs.nim

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import jsony
2+
3+
proc newRef[T](v: T): ref T =
4+
new(result)
5+
result[] = v
6+
7+
var
8+
a: ref int = newRef(123)
9+
b: ref int
10+
11+
doAssert a.toJson() == """123"""
12+
doAssert b.toJson() == """null"""
13+
14+
doAssert $(fromJson("""1""", ref int)[]) == "1"
15+
doAssert fromJson("""null""", ref int) == nil
16+
17+
proc check[T](v: T) =
18+
var v2: ref T = newRef(v)
19+
var v3: ref T = nil
20+
doAssert v2.toJson.fromJson(ref T)[] == v2[]
21+
doAssert v3.toJson.fromJson(ref T) == nil
22+
23+
check(1.int)
24+
check(1.int8)
25+
check(1.int16)
26+
check(1.int32)
27+
check(1.int64)
28+
check(1.uint8)
29+
check(1.uint16)
30+
check(1.uint32)
31+
check(1.uint64)
32+
33+
check("hello")
34+
check([1,2,3])
35+
check(@[1,2,3])
36+
37+
type Entry = object
38+
color: string
39+
40+
check(Entry())
41+
42+
type
43+
Test = object
44+
key: ref int
45+
var test = """{ "key": null }""".fromJson(Test)
46+
doAssert test.key == nil
47+
var test2 = """{ "key": 2 }""".fromJson(Test)
48+
doAssert test2.key != nil
49+
doAssert test2.key[] == 2

0 commit comments

Comments
 (0)