Assert upreservable pragma at runtime
This makes the compiler less pedantic.
This commit is contained in:
parent
d1be46de49
commit
29d7352a23
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue