Move some stuff around

This commit is contained in:
Emery Hemingway 2021-08-11 13:00:32 +02:00
parent 7359f1cac2
commit 16c8ce62ff
2 changed files with 28 additions and 21 deletions

View File

@ -536,10 +536,6 @@ proc `%`*[T](set: HashSet[T]): Preserve =
for e in set:
result.set.incl %e
proc `%`*[A,B](table: Table[A,B]|TableRef[A,B]): Preserve =
result = Preserve(kind: pkDictionary, dict: initTable[Preserve, Preserve](table.len))
for k, v in table.pairs: result.dict[%k] = %v
proc `%`*[T: object](o: T): Preserve =
## Construct JsonNode from tuples and objects.
result = initDictionary()
@ -606,12 +602,15 @@ proc toPreserve*[T](x: T): Preserve =
elif T is float64:
result = Preserve(kind: pkDouble, double: x)
elif T is object | tuple:
#[
when T.hasCustomPragma(unpreservable): {.fatal: "unpreservable type".}
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)))
else:
]#
block:
result = Preserve(kind: pkDictionary)
for k, v in x.fieldPairs: result.dict[symbol(k)] = toPreserve(v)
elif T is Ordinal:
@ -629,6 +628,10 @@ proc toPreserve*[T](x: T): Preserve =
proc toPreserveHook*[T](set: HashSet[T]): Preserve =
Preserve(kind: pkSet, set: set.map(toPreserve))
proc toPreserveHook*[A,B](table: Table[A,B]|TableRef[A,B]): Preserve =
result = Preserve(kind: pkDictionary, dict: initTable[Preserve, Preserve](table.len))
for k, v in table.pairs: result.dict[toPreserve k] = toPreserve v
proc toPreserveHook*(js: JsonNode): Preserve =
case js.kind
of JString:
@ -727,7 +730,7 @@ proc fromPreserve*[T](result: var T; prs: Preserve) =
elif T is object | tuple:
case prs.kind
of pkRecord:
checkRecordLabel(T, prs)
# checkRecordLabel(T, prs)
var i: int
for k, v in result.fieldPairs:
fromPreserve(v, prs.record[i])
@ -739,9 +742,10 @@ proc fromPreserve*[T](result: var T; prs: Preserve) =
raise newException(ValueError, "cannot convert to Preserves value to type " & $T)
elif T is Ordinal | SomeInteger:
result = (T)prs.int
elif T is ptr | ref:
if system.`==`(x, nil): result = symbol"null"
else: result = toPreserve(x[])
elif T is ref:
if prs != symbol"null":
new result
fromPreserve(result[], prs)
elif T is string:
result = prs.string
elif T is distinct:
@ -753,6 +757,9 @@ proc preserveTo*(prs: Preserve; T: typedesc): T =
## Reverse of `toPreserve`.
fromPreserve(result, prs)
proc fromPreserveHook*[A,B](result: var Table[A,B]|TableRef[A,B]; prs: Preserve) =
for k, v in prs.pairs: result[preserveTo(k,A)] = preserveTo(k,B)
proc len*(prs: Preserve): int =
## Return the number of values one level below ``prs``.
case prs.kind
@ -768,3 +775,16 @@ proc `[]`*(prs: Preserve; i: int): Preserve =
of pkSequence: prs.sequence[i]
else:
raise newException(ValueError, "`[]` is not valid for " & $prs.kind)
proc initRecord*(label: Preserve; args: varargs[Preserve, toPreserve]): Preserve =
## Record constructor.
result = Preserve(kind: pkRecord,
record: newSeqOfCap[Preserve](1+args.len))
for arg in args:
assertValid(arg)
result.record.add(arg)
result.record.add(label)
proc initRecord*(label: string; args: varargs[Preserve, toPreserve]): Preserve {.inline.} =
## Record constructor that converts ``label`` to a symbol.
initRecord(symbol(label), args)

View File

@ -3,19 +3,6 @@
import std/[macros, typetraits]
import ../preserves
proc initRecord*(label: Preserve; args: varargs[Preserve, toPreserve]): Preserve =
## Record constructor.
result = Preserve(kind: pkRecord,
record: newSeqOfCap[Preserve](1+args.len))
for arg in args:
assertValid(arg)
result.record.add(arg)
result.record.add(label)
proc initRecord*(label: string; args: varargs[Preserve, toPreserve]): Preserve {.inline.} =
## Record constructor that converts ``label`` to a symbol.
initRecord(symbol(label), args)
type RecordClass* = object
## Type of a preserves record.
label*: Preserve