Suppport preservesTupleTail pragma within objects
This commit is contained in:
parent
8b3b182ce7
commit
15390dd48e
|
@ -1,6 +1,6 @@
|
|||
# Package
|
||||
|
||||
version = "20230825"
|
||||
version = "20230912"
|
||||
author = "Emery Hemingway"
|
||||
description = "data model and serialization format"
|
||||
license = "Unlicense"
|
||||
|
|
|
@ -1101,10 +1101,19 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool {.gcsafe.} =
|
|||
if pr.isRecord and pr.label.isSymbol(T.getCustomPragmaVal(preservesRecord)):
|
||||
result = true
|
||||
var i: int
|
||||
for key, val in fieldPairs(v):
|
||||
if result and i <= pr.len:
|
||||
result = result and fieldFromPreserve(key, val, pr.record[i])
|
||||
inc i
|
||||
for name, field in fieldPairs(v):
|
||||
when v.dot(name).hasCustomPragma(preservesTupleTail):
|
||||
v.dot(name).setLen(pr.record.len.pred - i)
|
||||
var j: int
|
||||
while result and i < pr.record.high:
|
||||
result = result and fromPreserve(v.dot(name)[j], pr.record[i])
|
||||
inc i
|
||||
inc j
|
||||
break
|
||||
else:
|
||||
if result and i <= pr.len:
|
||||
result = result and fieldFromPreserve(name, field, pr.record[i])
|
||||
inc i
|
||||
result = result and (i <= pr.len)
|
||||
elif T.hasCustomPragma(preservesTuple):
|
||||
if pr.isSequence:
|
||||
|
|
|
@ -4,6 +4,11 @@
|
|||
import std/[options, tables, unittest, xmlparser, xmltree]
|
||||
import preserves, preserves/xmlhooks
|
||||
|
||||
type
|
||||
Route {.preservesRecord: "route".} = object
|
||||
`transports`*: seq[Preserve[void]]
|
||||
`pathSteps`* {.preservesTupleTail.}: seq[Preserve[void]]
|
||||
|
||||
suite "conversions":
|
||||
test "dictionary":
|
||||
type Bar = tuple
|
||||
|
@ -60,6 +65,11 @@ suite "conversions":
|
|||
checkpoint $pr
|
||||
check fromPreserve(a, pr)
|
||||
|
||||
test "preservesTupleTail":
|
||||
let pr = parsePreserves """<route [<tcp "localhost" 1024>] <ref {oid: "syndicate" sig: #x"69ca300c1dbfa08fba692102dd82311a"}>>"""
|
||||
var route: Route
|
||||
check route.fromPreserve(pr)
|
||||
|
||||
suite "toPreserve":
|
||||
template check(p: Preserve; s: string) =
|
||||
test s: check($p == s)
|
||||
|
|
Loading…
Reference in New Issue