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.}
|
template unpreservable*() {.pragma.}
|
||||||
## Pragma to forbid a type from being converted by ``toPreserve``.
|
## 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] =
|
proc toPreserve*[T](x: T; E = void): Preserve[E] =
|
||||||
## Serializes ``x`` to Preserves. Can be customized by defining
|
## 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)
|
cast[Preserve[E]](lit)
|
||||||
else:
|
else:
|
||||||
toPreserve(val, E)
|
toPreserve(val, E)
|
||||||
when T.hasCustomPragma(unpreservable): {.fatal: "unpreservable type".}
|
when T.hasCustomPragma(unpreservable):
|
||||||
|
raiseAssert($T & " is unpreservable")
|
||||||
elif T.hasCustomPragma(preservesOr):
|
elif T.hasCustomPragma(preservesOr):
|
||||||
var hasKind, hasVariant: bool
|
var hasKind, hasVariant: bool
|
||||||
for k, v in x.fieldPairs:
|
for k, v in x.fieldPairs:
|
||||||
|
@ -891,7 +894,8 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool =
|
||||||
pr == lit
|
pr == lit
|
||||||
else:
|
else:
|
||||||
fromPreserve(val, pr)
|
fromPreserve(val, pr)
|
||||||
when T.hasCustomPragma(unpreservable): {.fatal: "unpreservable type " & $T.}
|
when T.hasCustomPragma(unpreservable):
|
||||||
|
raiseAssert($T & " is unpreservable")
|
||||||
elif T.hasCustomPragma(preservesRecord):
|
elif T.hasCustomPragma(preservesRecord):
|
||||||
if pr.isRecord and pr.label.isSymbol(T.getCustomPragmaVal(preservesRecord)):
|
if pr.isRecord and pr.label.isSymbol(T.getCustomPragmaVal(preservesRecord)):
|
||||||
result = true
|
result = true
|
||||||
|
|
Loading…
Reference in New Issue