Move some stuff around
This commit is contained in:
parent
7359f1cac2
commit
16c8ce62ff
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue