Assert upreservable pragma at runtime

This makes the compiler less pedantic.
This commit is contained in:
Emery Hemingway 2021-10-25 21:33:31 +02:00
parent d1be46de49
commit 29d7352a23
1 changed files with 7 additions and 3 deletions

View File

@ -650,7 +650,9 @@ template preservesLiteral*(value: typed) {.pragma.}
template unpreservable*() {.pragma.}
## Pragma to forbid a type from being converted by ``toPreserve``.
## See ``toPreserve``.
## Useful for preventing an embeded type from being encoded
## as its native type.
## Unpreservability is asserted at runtime.
proc toPreserve*[T](x: T; E = void): Preserve[E] =
## Serializes ``x`` to Preserves. Can be customized by defining
@ -704,7 +706,8 @@ proc toPreserve*[T](x: T; E = void): Preserve[E] =
cast[Preserve[E]](lit)
else:
toPreserve(val, E)
when T.hasCustomPragma(unpreservable): {.fatal: "unpreservable type".}
when T.hasCustomPragma(unpreservable):
raiseAssert($T & " is unpreservable")
elif T.hasCustomPragma(preservesOr):
var hasKind, hasVariant: bool
for k, v in x.fieldPairs:
@ -891,7 +894,8 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool =
pr == lit
else:
fromPreserve(val, pr)
when T.hasCustomPragma(unpreservable): {.fatal: "unpreservable type " & $T.}
when T.hasCustomPragma(unpreservable):
raiseAssert($T & " is unpreservable")
elif T.hasCustomPragma(preservesRecord):
if pr.isRecord and pr.label.isSymbol(T.getCustomPragmaVal(preservesRecord)):
result = true