Skip to content

Commit 0ce3952

Browse files
authored
Merge pull request #56 from pietroppeter/table-generic-key
fix #52: allow enum keys when parsing tables
2 parents 649705e + 7361cfb commit 0ce3952

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

src/jsony.nim

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ type
1818
proc parseHook*[T](s: string, i: var int, v: var seq[T])
1919
proc parseHook*[T: enum](s: string, i: var int, v: var T)
2020
proc parseHook*[T: object|ref object](s: string, i: var int, v: var T)
21-
proc parseHook*[T](s: string, i: var int, v: var SomeTable[string, T])
21+
proc parseHook*[K: string | enum, V](s: string, i: var int, v: var SomeTable[K, V])
2222
proc parseHook*[T](s: string, i: var int, v: var (SomeSet[T]|set[T]))
2323
proc parseHook*[T: tuple](s: string, i: var int, v: var T)
2424
proc parseHook*[T: array](s: string, i: var int, v: var T)
@@ -494,7 +494,7 @@ proc parseHook*[T](s: string, i: var int, v: var Option[T]) =
494494
parseHook(s, i, e)
495495
v = some(e)
496496

497-
proc parseHook*[T](s: string, i: var int, v: var SomeTable[string, T]) =
497+
proc parseHook*[K: string | enum, V](s: string, i: var int, v: var SomeTable[K, V]) =
498498
## Parse an object.
499499
when compiles(new(v)):
500500
new(v)
@@ -503,10 +503,10 @@ proc parseHook*[T](s: string, i: var int, v: var SomeTable[string, T]) =
503503
eatSpace(s, i)
504504
if i < s.len and s[i] == '}':
505505
break
506-
var key: string
506+
var key: K
507507
parseHook(s, i, key)
508508
eatChar(s, i, ':')
509-
var element: T
509+
var element: V
510510
parseHook(s, i, element)
511511
v[key] = element
512512
if i < s.len and s[i] == ',':

tests/test_tables.nim

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,23 @@ block:
5757

5858
doAssert [{"j": "a"}].toJson() ==
5959
"""[{"j":"a"}]"""
60+
61+
block: # issue 52
62+
type Color = enum
63+
Red = "red", Green = "green", Blue = "blue"
64+
let s = """{
65+
"red": 1,
66+
"blue": 3
67+
}"""
68+
let v = s.fromJson(Table[Color, int])
69+
doAssert v.len == 2
70+
doAssert v[Red] == 1
71+
doAssert v[Blue] == 3
72+
73+
block: # issue 52
74+
type Answer {.pure.} = enum
75+
A, B, C
76+
let a = {A: "aaaa", B: "bbb"}.toTable
77+
doAssert $(a.toJson()) == """{"A":"aaaa","B":"bbb"}"""
78+
let t = a.toJson().fromJson(Table[Answer, string])
79+
doAssert t == a

0 commit comments

Comments
 (0)