deserialize key defaults to serialize key

This commit is contained in:
Eric 2024-02-05 12:24:05 +11:00
parent 1a6ab42434
commit d8bf5b0eae
No known key found for this signature in database
2 changed files with 26 additions and 2 deletions

View File

@ -245,14 +245,22 @@ proc fromJson*[T](
arr.add(? T.fromJson(elem))
success arr
template getSerializationKey(fieldName, fieldValue): string =
when fieldValue.hasCustomPragma(serialize):
let (key, _) = fieldValue.getCustomPragmaVal(serialize)
if key != "": key
else: fieldName
else: fieldName
template getDeserializationKey(fieldName, fieldValue): string =
let serializationKey = getSerializationKey(fieldName, fieldValue)
when fieldValue.hasCustomPragma(deserialize):
fieldValue.expectMissingPragmaParam(deserialize, "mode",
"Cannot set 'mode' on field defintion.")
let (key, mode) = fieldValue.getCustomPragmaVal(deserialize)
if key != "": key
else: fieldName
else: fieldName
else: serializationKey # defaults to fieldName
else: serializationKey # defaults to fieldName
template getDeserializationMode(T): DeserializeMode =
when T.hasCustomPragma(deserialize):

View File

@ -374,6 +374,22 @@ suite "json serialization pragmas":
let val = !MyObj.fromJson("""{"test":true,"field2":true}""")
check val == MyObj(field1: true, field2: true)
test "deserialization key can be set using serialize key":
type MyObj = object
field1 {.serialize("test").}: bool
field2: bool
let val = !MyObj.fromJson("""{"test":true,"field2":true}""")
check val == MyObj(field1: true, field2: true)
test "deserialization key takes priority over serialize key":
type MyObj = object
field1 {.serialize("test"), deserialize("test1").}: bool
field2: bool
let val = !MyObj.fromJson("""{"test":false,"test1":true,"field2":true}""")
check val == MyObj(field1: true, field2: true)
test "fails to deserialize object field with wrong type":
type MyObj = object
field1: int