From 2eda0fc9a74e9054b77fcb60ae23693498ae92aa Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Thu, 1 Jul 2021 12:47:30 +0200 Subject: [PATCH] Add {.unpreservable.} pragma --- src/preserves.nim | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/preserves.nim b/src/preserves.nim index d4573b5..5488671 100644 --- a/src/preserves.nim +++ b/src/preserves.nim @@ -1,7 +1,7 @@ # SPDX-License-Identifier: ISC import bigints -import std/[base64, endians, json, hashes, macros, sets, streams, tables] +import std/[base64, endians, json, hashes, macros, sets, streams, tables, typetraits] type @@ -245,9 +245,6 @@ iterator fields*(prs: Preserve): Preserve = ## Iterate the fields of a record value. for i in 0.. ## ``` +template unpreservable*() {.pragma.} + ## Pragma to forbid a type from being converted by `toPreserve`. + proc toPreserve*[T](x: T): Preserve = ## Serializes `x` to Preserves; uses `toPreserveHook(x: A)` if it's in scope to ## customize serialization. @@ -483,7 +483,8 @@ proc toPreserve*[T](x: T): Preserve = elif T is float64: result = Preserve(kind: pkDouble, double: x) elif T is object | tuple: - when T.hasCustomPragma(record): + when T.hasCustomPragma(unpreservable): {.error.} + elif T.hasCustomPragma(record): result = Preserve(kind: pkRecord) for _, f in x.fieldPairs: result.record.add(toPreserve(f)) result.record.add(symbol(T.getCustomPragmaVal(record)))