A more robust helper for borrowing serialization procs

This commit is contained in:
Zahary Karadjov 2020-06-23 22:21:49 +03:00
parent 5498b62dbd
commit a49e001f9e
No known key found for this signature in database
GPG Key ID: C8936F8A3073D609
1 changed files with 33 additions and 0 deletions

View File

@ -1,4 +1,5 @@
import import
typetraits,
stew/shims/macros, faststreams, stew/shims/macros, faststreams,
serialization/[object_serialization, errors] serialization/[object_serialization, errors]
@ -112,6 +113,17 @@ template saveFile*(Format: type, filename: string, value: auto, params: varargs[
finally: finally:
close stream close stream
template borrowSerialization*(Alias: type) {.dirty.} =
bind distinctBase
proc writeValue*[Writer](writer: var Writer, value: Alias) =
mixin writeValue
writeValue(writer, distinctBase value)
proc readValue*[Reader](reader: var Reader, value: var Alias) =
mixin readValue
value = Alias reader.readValue(distinctBase Alias)
template borrowSerialization*(Alias: distinct type, template borrowSerialization*(Alias: distinct type,
OriginalType: distinct type) {.dirty.} = OriginalType: distinct type) {.dirty.} =
@ -123,6 +135,27 @@ template borrowSerialization*(Alias: distinct type,
mixin readValue mixin readValue
value = Alias reader.readValue(OriginalType) value = Alias reader.readValue(OriginalType)
template serializesAsBase*(SerializedType: distinct type,
Format: distinct type) =
mixin ReaderType, WriterType
type Reader = ReaderType(Format)
type Writer = WriterType(Format)
template writeValue*(writer: var Writer, value: SerializedType) =
mixin writeValue
writeValue(writer, distinctBase value)
template readValue*(reader: var Reader, value: var SerializedType) =
mixin readValue
value = SerializedType reader.readValue(distinctBase SerializedType)
macro serializesAsBaseIn*(SerializedType: type,
Formats: varargs[untyped]) =
result = newStmtList()
for Fmt in Formats:
result.add newCall(bindSym"serializesAsBase", SerializedType, Fmt)
template readValue*(stream: InputStream, template readValue*(stream: InputStream,
Format: type, Format: type,
ValueType: type, ValueType: type,