Compare commits

...

3 Commits

Author SHA1 Message Date
Emery Hemingway ddc26f0c71 Add pragma accessors
This library requires a forked macros module, so export accessors
that would prevent a downstream library from having the same
problems with std/macros.
2022-04-25 11:33:37 -05:00
Emery Hemingway f32e783e0b Unembed during fromPreserve 2022-04-22 00:28:36 -05:00
Emery Hemingway a3c55238f5 Generate `data` fields for anonymous patterns 2022-03-19 09:13:23 -05:00
3 changed files with 27 additions and 4 deletions

View File

@ -635,6 +635,18 @@ template preservesRecord*(label: string) {.pragma.}
## Serialize this object or tuple as a record.
## See ``toPreserve``.
proc hasPreservesRecordPragma*(T: typedesc): bool =
## Test if a type has a `{.preservesRecord: "…".}` pragma attached.
hasCustomPragma(T, preservesRecord)
proc recordLabel*(T: typedesc): string =
## Get the record label set by a pragma on a type.
runnableExamples:
type Foo {.preservesRecord: "bar".} = object
n: int
assert recordLabel(Foo) == "bar"
T.getCustomPragmaVal(preservesRecord)
template preservesTuple*() {.pragma.}
## Serialize this object or tuple as a tuple.
## See ``toPreserve``.
@ -643,10 +655,18 @@ template preservesTupleTail*() {.pragma.}
## Serialize this object field to the end of its containing tuple.
## See ``toPreserve``.
proc hasPreservesTuplePragma*(T: typedesc): bool =
## Test if a type has a `preservesTuple` pragma attached.
hasCustomPragma(T, preservesTuple)
template preservesDictionary*() {.pragma.}
## Serialize this object or tuple as a dictionary.
## See ``toPreserve``.
proc hasPreservesDictionaryPragma*(T: typedesc): bool =
## Test if a type has a `preservesDictionary` pragma attached.
hasCustomPragma(T, preservesDictionary)
template preservesOr*() {.pragma.}
## Serialize this object as an ``or`` alternative.
## See ``toPreserve``.
@ -785,6 +805,10 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool =
assert(fromPreserve(foo, parsePreserves("""<foo 1 2>""")))
assert(foo.x == 1)
assert(foo.y == 2)
when T is E:
if not pr.embedded and pr.kind == pkEmbedded:
v = pr.embed
return true
when T is Preserve[E]:
v = pr
result = true

View File

@ -10,7 +10,7 @@ import std/[hashes, sequtils, strutils, sets, tables]
import compiler/[ast, idents, renderer, lineinfos]
import ../preserves, ./schema, ./parse
import ../preserves, ./schema
type
Bundle = schema.Bundle[void]
@ -487,8 +487,7 @@ proc addFields(recList: PNode; scm: Schema; known: var TypeTable; cp: CompoundPa
proc addFields(recList: PNode; scm: Schema; known: var TypeTable; pat: Pattern; parentName: string): PNode {.discardable.} =
case pat.orKind
of PatternKind.SimplePattern:
raiseAssert "addFields called with SimplePattern " #& $pat.simplePattern
# addField(recList, scm, known, pat.simplePattern, "data")
addField(recList, scm, known, pat.simplePattern, "data")
of PatternKind.CompoundPattern:
discard addFields(recList, scm, known, pat.compoundPattern, parentName)
reclist

View File

@ -6,7 +6,7 @@ from std/os import absolutePath, isAbsolute, getCurrentDir, parentDir
import npeg
import ../preserves, ./schema, ./parse, ./pegs
import ../preserves, ./schema, ./pegs
type
Value = Preserve[void]