Suppport preservesTupleTail pragma within objects

This commit is contained in:
Emery Hemingway 2023-09-12 11:35:09 +02:00
parent 8b3b182ce7
commit 15390dd48e
3 changed files with 24 additions and 5 deletions

View File

@ -1,6 +1,6 @@
# Package
version = "20230825"
version = "20230912"
author = "Emery Hemingway"
description = "data model and serialization format"
license = "Unlicense"

View File

@ -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:

View File

@ -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)