Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix #52: allow enum keys when parsing tables #56

Merged
merged 10 commits into from
Mar 21, 2024
8 changes: 4 additions & 4 deletions src/jsony.nim
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ type
proc parseHook*[T](s: string, i: var int, v: var seq[T])
proc parseHook*[T: enum](s: string, i: var int, v: var T)
proc parseHook*[T: object|ref object](s: string, i: var int, v: var T)
proc parseHook*[T](s: string, i: var int, v: var SomeTable[string, T])
proc parseHook*[K: string | enum, V](s: string, i: var int, v: var SomeTable[K, V])
proc parseHook*[T](s: string, i: var int, v: var (SomeSet[T]|set[T]))
proc parseHook*[T: tuple](s: string, i: var int, v: var T)
proc parseHook*[T: array](s: string, i: var int, v: var T)
Expand Down Expand Up @@ -455,7 +455,7 @@ proc parseHook*[T](s: string, i: var int, v: var Option[T]) =
parseHook(s, i, e)
v = some(e)

proc parseHook*[T](s: string, i: var int, v: var SomeTable[string, T]) =
proc parseHook*[K: string | enum, V](s: string, i: var int, v: var SomeTable[K, V]) =
## Parse an object.
when compiles(new(v)):
new(v)
Expand All @@ -464,10 +464,10 @@ proc parseHook*[T](s: string, i: var int, v: var SomeTable[string, T]) =
eatSpace(s, i)
if i < s.len and s[i] == '}':
break
var key: string
var key: K
parseHook(s, i, key)
eatChar(s, i, ':')
var element: T
var element: V
parseHook(s, i, element)
v[key] = element
if i < s.len and s[i] == ',':
Expand Down
20 changes: 20 additions & 0 deletions tests/test_tables.nim
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,23 @@ block:

doAssert [{"j":"a"}].toJson() ==
"""[{"j":"a"}]"""

block: # issue 52
type Color = enum
Red = "red", Green = "green", Blue = "blue"
let s = """{
"red": 1,
"blue": 3
}"""
var v = s.fromJson(Table[Color, int])
doAssert v.len == 2
doAssert v[Red] == 1
doAssert v[Blue] == 3

block: # issue 52
type Answer {.pure.} = enum
A, B, C
let a = {A: "aaaa", B: "bbb"}.toTable
doAssert $(a.toJson()) == """{"A":"aaaa","B":"bbb"}"""
doAssert $(a.toJson().fromJson(Table[Answer, string])) ==
"""{A: "aaaa", B: "bbb"}"""