Skip to content

Commit ea62683

Browse files
authored
Merge pull request #25 from konradmb/set-hook
Add hooks for set type
2 parents f9cb943 + 4e2375e commit ea62683

File tree

2 files changed

+105
-4
lines changed

2 files changed

+105
-4
lines changed

src/jsony.nim

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ proc parseHook*[T](s: string, i: var int, v: var seq[T])
1414
proc parseHook*[T: enum](s: string, i: var int, v: var T)
1515
proc parseHook*[T: object|ref object](s: string, i: var int, v: var T)
1616
proc parseHook*[T](s: string, i: var int, v: var SomeTable[string, T])
17-
proc parseHook*[T](s: string, i: var int, v: var SomeSet[T])
17+
proc parseHook*[T](s: string, i: var int, v: var (SomeSet[T]|set[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)
2020
proc parseHook*[T: not object](s: string, i: var int, v: var ref T)
@@ -450,8 +450,8 @@ proc parseHook*[T](s: string, i: var int, v: var SomeTable[string, T]) =
450450
break
451451
eatChar(s, i, '}')
452452

453-
proc parseHook*[T](s: string, i: var int, v: var SomeSet[T]) =
454-
## Parse HashSet.
453+
proc parseHook*[T](s: string, i: var int, v: var (SomeSet[T]|set[T])) =
454+
## Parse HashSet or set type.
455455
eatSpace(s, i)
456456
eatChar(s, i, '[')
457457
while true:
@@ -756,7 +756,7 @@ proc dumpHook*(s: var string, v: ref) =
756756
else:
757757
s.dumpHook(v[])
758758

759-
proc dumpHook*[T](s: var string, v: HashSet[T]|OrderedSet[T]) =
759+
proc dumpHook*[T](s: var string, v: HashSet[T]|OrderedSet[T]|set[T]) =
760760
s.add '['
761761
var i = 0
762762
for e in v:

tests/test_set.nim

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import jsony
2+
3+
#set[int8], set[int16]
4+
block:
5+
let
6+
s1: set[int8] = {1'i8, 2, 3}
7+
s2: set[int16] = {1'i16, 2, 3}
8+
9+
doAssert s1.toJson() == "[1,2,3]"
10+
doAssert s2.toJson() == "[1,2,3]"
11+
12+
doAssert s1.toJson.fromJson(set[int8]) == s1
13+
doAssert s2.toJson.fromJson(set[int16]) == s2
14+
15+
#set[uint8], set[uint16]
16+
block:
17+
let
18+
s1: set[uint8] = {1'u8, 2, 3}
19+
s2: set[uint16] = {1'u16, 2, 3}
20+
21+
doAssert s1.toJson() == "[1,2,3]"
22+
doAssert s2.toJson() == "[1,2,3]"
23+
24+
doAssert s1.toJson.fromJson(set[uint8]) == s1
25+
doAssert s2.toJson.fromJson(set[uint16]) == s2
26+
27+
#set[char]
28+
block:
29+
let
30+
s1: set[char] = {'0'..'9'}
31+
32+
doAssert s1.toJson() == """["0","1","2","3","4","5","6","7","8","9"]"""
33+
34+
doAssert s1.toJson.fromJson(set[char]) == s1
35+
36+
#set[enum]
37+
block:
38+
type
39+
E1 = enum
40+
e1Elem1, e1Elem2, e1Elem3
41+
E2 = enum
42+
e2Elem1 = "custString1", e2Elem2 = "custString2", e2Elem3 = "custString3"
43+
E3 = enum
44+
e3Elem1 = 10, e3Elem2 = 20, e3Elem3 = 30
45+
46+
let
47+
s1: set[E1] = {e1Elem1, e1Elem2, e1Elem3}
48+
s2: set[E2] = {e2Elem1, e2Elem2, e2Elem3}
49+
s3: set[E3] = {e3Elem1, e3Elem2, e3Elem3}
50+
51+
doAssert s1.toJson() == """["e1Elem1","e1Elem2","e1Elem3"]"""
52+
doAssert s2.toJson() == """["custString1","custString2","custString3"]"""
53+
doAssert s3.toJson() == """["e3Elem1","e3Elem2","e3Elem3"]"""
54+
55+
doAssert s1.toJson.fromJson(set[E1]) == s1
56+
doAssert s2.toJson.fromJson(set[E2]) == s2
57+
doAssert s3.toJson.fromJson(set[E3]) == s3
58+
59+
#type set[enum]
60+
block:
61+
type
62+
E1 = enum
63+
e1Elem1, e1Elem2, e1Elem3
64+
S1 = set[E1]
65+
66+
let
67+
s1: S1 = {e1Elem1, e1Elem2, e1Elem3}
68+
69+
doAssert s1.toJson() == """["e1Elem1","e1Elem2","e1Elem3"]"""
70+
71+
doAssert s1.toJson.fromJson(set[E1]) == s1
72+
73+
#object with set[enum]
74+
block:
75+
type
76+
E1 = enum
77+
e1Elem1, e1Elem2, e1Elem3
78+
O1 = object
79+
e1: set[E1]
80+
81+
let
82+
o1: O1 = O1(e1: {e1Elem1, e1Elem2, e1Elem3})
83+
84+
doAssert o1.toJson() == """{"e1":["e1Elem1","e1Elem2","e1Elem3"]}"""
85+
86+
doAssert o1.toJson.fromJson(O1) == o1
87+
88+
#ref object with set[enum]
89+
block:
90+
type
91+
E1 = enum
92+
e1Elem1, e1Elem2, e1Elem3
93+
O1 = ref object
94+
e1: set[E1]
95+
96+
let
97+
o1: O1 = O1(e1: {e1Elem1, e1Elem2, e1Elem3})
98+
99+
doAssert o1.toJson() == """{"e1":["e1Elem1","e1Elem2","e1Elem3"]}"""
100+
101+
doAssert o1.toJson.fromJson(O1)[] == o1[]

0 commit comments

Comments
 (0)