From e65dc2271f304e867c8e4a76388443d64e015321 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 1 Aug 2023 11:09:13 +0100 Subject: [PATCH] Preserve JSON object keys as symbols --- preserves.nimble | 2 +- src/preserves.nim | 2 +- src/preserves/jsonhooks.nim | 16 +++++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/preserves.nimble b/preserves.nimble index fea3520..784110c 100644 --- a/preserves.nimble +++ b/preserves.nimble @@ -1,6 +1,6 @@ # Package -version = "20230723" +version = "20230801" author = "Emery Hemingway" description = "data model and serialization format" license = "Unlicense" diff --git a/src/preserves.nim b/src/preserves.nim index 7f09b3b..e0d3516 100644 --- a/src/preserves.nim +++ b/src/preserves.nim @@ -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``. diff --git a/src/preserves/jsonhooks.nim b/src/preserves/jsonhooks.nim index 45c0c96..40de6d3 100644 --- a/src/preserves/jsonhooks.nim +++ b/src/preserves/jsonhooks.nim @@ -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