Skip to content

Commit 4121040

Browse files
committed
Add tuples and arrays.
1 parent 7a4af95 commit 4121040

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed

src/jsony.nim

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ proc parseJson[T](s: string, i: var int, v: var seq[T])
88
proc parseJson[T:enum](s: string, i: var int, v: var T)
99
proc parseJson[T:object|ref object](s: string, i: var int, v: var T)
1010
proc parseJson[T](s: string, i: var int, v: var Table[string, T])
11+
proc parseJson[T:tuple](s: string, i: var int, v: var T)
12+
proc parseJson[T:array](s: string, i: var int, v: var T)
1113

1214
template error(msg: string, i: int) =
1315
## Short cut to raise an exception.
@@ -123,6 +125,30 @@ proc parseJson[T](s: string, i: var int, v: var seq[T]) =
123125
break
124126
eat(s, i, ']')
125127

128+
proc parseJson[T:tuple](s: string, i: var int, v: var T) =
129+
eatSpace(s, i)
130+
var strV: string
131+
eat(s, i, '[')
132+
for name, value in v.fieldPairs:
133+
eatSpace(s, i)
134+
parseJson(s, i, value)
135+
eatSpace(s, i)
136+
if s[i] == ',':
137+
inc i
138+
eat(s, i, ']')
139+
140+
proc parseJson[T:array](s: string, i: var int, v: var T) =
141+
eatSpace(s, i)
142+
var strV: string
143+
eat(s, i, '[')
144+
for value in v.mitems:
145+
eatSpace(s, i)
146+
parseJson(s, i, value)
147+
eatSpace(s, i)
148+
if s[i] == ',':
149+
inc i
150+
eat(s, i, ']')
151+
126152
proc skipValue(s: string, i: var int) =
127153
## Used to skip values of extra fields.
128154
#echo "Skip:", s[i .. min(i + 80, s.len-1)]

tests/test_arrays.nim

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import jsony
2+
3+
block:
4+
var s = "[1, 2, 3]"
5+
var v = fromJson[array[3, int]](s)
6+
doAssert v[0] == 1
7+
doAssert v[1] == 2
8+
doAssert v[2] == 3
9+
10+
block:
11+
var s = "[1.5, 2.25, 3.0]"
12+
var v = fromJson[array[3, float32]](s)
13+
doAssert v[0] == 1.5
14+
doAssert v[1] == 2.25
15+
doAssert v[2] == 3.0
16+
17+
block:
18+
var s = """["no", "yes"]"""
19+
var v = fromJson[array[2, string]](s)
20+
doAssert v[0] == "no"
21+
doAssert v[1] == "yes"

tests/test_tuples.nim

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import jsony
2+
3+
block:
4+
var s = "[1, 2, 3]"
5+
var v = fromJson[(int, int, int)](s)
6+
doAssert v[0] == 1
7+
doAssert v[1] == 2
8+
doAssert v[2] == 3
9+
10+
block:
11+
var s = """[1, "hi", 3.5]"""
12+
var v = fromJson[(int, string, float32)](s)
13+
doAssert v[0] == 1
14+
doAssert v[1] == "hi"
15+
doAssert v[2] == 3.5
16+
17+
block:
18+
type Entry = tuple[id:int, name:string, dist:float32]
19+
var s = """[134, "red", 13.5]"""
20+
var v = fromJson[Entry](s)
21+
doAssert v[0] == 134
22+
doAssert v[1] == "red"
23+
doAssert v[2] == 13.5
24+
doAssert v.id == 134
25+
doAssert v.name == "red"
26+
doAssert v.dist == 13.5
27+
28+
block:
29+
type Vector3i = tuple[x:int, y:int, z:int]
30+
var s = """[0, 1, 2]"""
31+
var v = fromJson[Vector3i](s)
32+
doAssert v[0] == 0
33+
doAssert v[1] == 1
34+
doAssert v[2] == 2
35+
doAssert v.x == 0
36+
doAssert v.y == 1
37+
doAssert v.z == 2

0 commit comments

Comments
 (0)