status-lib/status/types/conversions.nim

55 lines
1.4 KiB
Nim

import
json_serialization, json_serialization/lexer, stew/results, web3/conversions
export
results
proc writeValue*[V, E](writer: var JsonWriter, value: Result[V, E]) =
writer.beginRecord(type(value))
writer.writeField("o", value.isOk)
if value.isOk:
when V isnot void:
writer.writeField("v", value.get)
else:
writer.writeField("e", value.error)
writer.endRecord()
proc readValue*[V, E](reader: var JsonReader, value: var Result[V, E]) =
# {"o":true} - void value type
# {"o":true, "v":"some val"} - string value type
# {"o":false, "e":0} - if the error type is an enum, will be an int
reader.skipToken tkCurlyLe
let oName = reader.readValue(string)
if oName != "o":
reader.raiseUnexpectedValue("Missing field 'o'")
reader.skipToken tkColon
let o = reader.readValue(bool)
if o:
when V is void:
value = Result[V, E].ok()
when V isnot void:
reader.skipToken tkComma
let vName = reader.readValue(string)
if vName != "v":
reader.raiseUnexpectedValue("Missing field 'v'")
reader.skipToken tkColon
let v = reader.readValue(V)
value = Result[V, E].ok v
else:
reader.skipToken tkComma
let eName = reader.readValue(string)
if eName != "e":
reader.raiseUnexpectedValue("Missing field 'e'")
reader.skipToken tkColon
let e = reader.readValue(E)
value = Result[V, E].err e
reader.skipToken tkCurlyRi