diff --git a/preserves.nimble b/preserves.nimble index 56b87c2..afbe389 100644 --- a/preserves.nimble +++ b/preserves.nimble @@ -1,6 +1,6 @@ # Package -version = "20230403" +version = "20230410" author = "Emery Hemingway" description = "data model and serialization format" license = "Unlicense" diff --git a/src/preserves/Tupfile b/src/preserves/Tupfile index d6bea78..aee9354 100644 --- a/src/preserves/Tupfile +++ b/src/preserves/Tupfile @@ -1,2 +1,3 @@ include_rules : foreach preserves_schema_nim.nim schemac.nim |> !nim |> $(BIN_DIR)/%B | $(BIN_DIR)/<%B> +: foreach *hooks.nim |> !nim_check |> diff --git a/src/preserves/jsonhooks.nim b/src/preserves/jsonhooks.nim index 6d97730..45c0c96 100644 --- a/src/preserves/jsonhooks.nim +++ b/src/preserves/jsonhooks.nim @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway +# SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-License-Identifier: Unlicense import std/[json, tables] @@ -28,7 +28,14 @@ proc toPreserveHook*(js: JsonNode; E: typedesc): Preserve[E] = for i, e in js.elems: result.sequence[i] = toPreserveHook(e, E) -proc fromPreserveHook*[E](js: var JsonNode; prs: Preserve[E]): bool = +proc fromPreserveHook*[E](js: var JsonNode; prs: Preserve[E]): bool {.gcsafe.} = + runnableExamples: + import std/json + var js = JsonNode() + var pr = js.toPreserveHook(void) + assert fromPreserveHook(js, pr) + fromJsonHook(pr, js) + js = toJsonHook(pr) case prs.kind: of pkBoolean: js = newJBool(prs.bool) @@ -54,14 +61,14 @@ proc fromPreserveHook*[E](js: var JsonNode; prs: Preserve[E]): bool = js = newJArray() js.elems.setLen(prs.sequence.len) for i, val in prs.sequence: - if not fromPreserve(js.elems[i], val): + if not fromPreserveHook(js.elems[i], val): return false of pkSet: js = newJArray() js.elems.setLen(prs.set.len) var i: int for val in prs.set: - if not fromPreserve(js.elems[i], val): + if not fromPreserveHook(js.elems[i], val): return false inc i of pkDictionary: @@ -70,7 +77,7 @@ proc fromPreserveHook*[E](js: var JsonNode; prs: Preserve[E]): bool = if key.kind != pkString: return false var jsVal: JsonNode - if not fromPreserve(jsVal, val): return false + if not fromPreserveHook(jsVal, val): return false js[key.string] = jsVal else: return false true @@ -81,10 +88,3 @@ proc toJsonHook*[E](pr: Preserve[E]): JsonNode = proc fromJsonHook*[E](pr: var Preserve[E]; js: JsonNode) = pr = toPreserveHook(js, E) - -when isMainModule: - var js = JsonNode() - var pr = js.toPreserveHook(void) - assert fromPreserveHook(js, pr) - fromJsonHook(pr, js) - js = toJsonHook(pr)