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