Preserve JSON object keys as symbols

This commit is contained in:
Emery Hemingway 2023-08-01 11:09:13 +01:00
parent 5fa72cd25b
commit e65dc2271f
3 changed files with 13 additions and 7 deletions

View File

@ -1,6 +1,6 @@
# Package
version = "20230723"
version = "20230801"
author = "Emery Hemingway"
description = "data model and serialization format"
license = "Unlicense"

View File

@ -264,7 +264,7 @@ proc `[]`*(pr: Preserve; i: int): Preserve =
of pkRecord: pr.record[i]
of pkSequence: pr.sequence[i]
else:
raise newException(ValueError, "`Preserves value is not indexable")
raise newException(ValueError, "Preserves value is not indexable")
proc `[]=`*(pr: var Preserve; i: Natural; val: Preserve) =
## Assign an indexed value into ``pr``.

View File

@ -21,7 +21,7 @@ proc toPreserveHook*(js: JsonNode; E: typedesc): Preserve[E] =
of JObject:
result = Preserve[E](kind: pkDictionary)
for key, val in js.fields.pairs:
result[Preserve[E](kind: pkString, string: key)] = toPreserveHook(val, E)
result[Preserve[E](kind: pkSymbol, symbol: Symbol key)] = toPreserveHook(val, E)
of JArray:
result = Preserve[E](kind: pkSequence,
sequence: newSeq[Preserve[E]](js.elems.len))
@ -74,11 +74,17 @@ proc fromPreserveHook*[E](js: var JsonNode; prs: Preserve[E]): bool {.gcsafe.} =
of pkDictionary:
js = newJObject()
for (key, val) in prs.dict.items:
if key.kind != pkString:
case key.kind
of pkSymbol:
var jsVal: JsonNode
if not fromPreserveHook(jsVal, val): return false
js[string key.symbol] = jsVal
of pkString:
var jsVal: JsonNode
if not fromPreserveHook(jsVal, val): return false
js[key.string] = jsVal
else:
return false
var jsVal: JsonNode
if not fromPreserveHook(jsVal, val): return false
js[key.string] = jsVal
else: return false
true