From 633cb0a3c4efc134bfeed17db88d238ee80227b8 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 8 Mar 2022 15:25:03 -0600 Subject: [PATCH] Tweak fromPreserve for floats and objects --- src/preserves.nim | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/preserves.nim b/src/preserves.nim index 5ad3da7..2a182d1 100644 --- a/src/preserves.nim +++ b/src/preserves.nim @@ -663,7 +663,7 @@ proc toPreserve*[T](x: T; E = void): Preserve[E] = for v in x.items: result.sequence.add(toPreserve(v, E)) elif T is bool: result = Preserve[E](kind: pkBoolean, bool: x) - elif T is float: + elif T is float32: result = Preserve[E](kind: pkFloat, float: x) elif T is float64: result = Preserve[E](kind: pkDouble, double: x) @@ -796,10 +796,6 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool = if pr.kind == pkSignedInteger: v = T(pr.int) result = true - elif T is float: - if pr.kind == pkFloat: - v = pr.float - result = true elif T is seq[byte]: if pr.kind == pkByteString: v = pr.bytes @@ -813,6 +809,10 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool = if not result: v.setLen 0 break + elif T is float32: + if pr.kind == pkFloat: + v = pr.float + result = true elif T is float64: case pr.kind of pkFloat: @@ -821,6 +821,7 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool = of pkDouble: v = pr.double result = true + else: discard elif T is Ordinal | SomeInteger: if pr.kind == pkSignedInteger: v = (T)pr.int @@ -855,8 +856,9 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool = if tupleLen(T) == pr.len: result = true for key, val in fieldPairs(v): - if result: - result = result and fromPreserve(val, pr[toSymbol(key, E)]) + try: result = fromPreserve(val, pr[toSymbol(key, E)]) + except KeyError: result = false + if not result: break else: discard elif T is ref: if isNil(v): new(v) @@ -921,9 +923,21 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool = # hopefully a `discard` of-branch, so discard `pr` result = true if result: break - else: result = fromPreserveHook(v, pr) - else: result = fromPreserveHook(v, pr) - # the hook doesn't compile but produces a useful error + else: + if pr.isDictionary: + result = true + var i: int + for key, _ in fieldPairs(v): + let val = pr.getOrDefault(toSymbol(key, E)) + result = result and fieldFromPreserve( + key, v.dot(key), val) + if not result: break + inc i + result = result and (i == pr.len) + else: + result = fromPreserveHook(v, pr) + # a previous branch determined that the hook does not compile but + # calling it here explicitly produces a reasonable compiler error if not result: trace T, " !- ", pr else: