From d8bf5b0eaef11131b7971e48e62b788319b33aae Mon Sep 17 00:00:00 2001 From: Eric <5089238+emizzle@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:24:05 +1100 Subject: [PATCH] deserialize key defaults to serialize key --- ethers/providers/jsonrpc/json.nim | 12 ++++++++++-- testmodule/providers/jsonrpc/testjson.nim | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/ethers/providers/jsonrpc/json.nim b/ethers/providers/jsonrpc/json.nim index 5ccd3d0..a921557 100644 --- a/ethers/providers/jsonrpc/json.nim +++ b/ethers/providers/jsonrpc/json.nim @@ -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): diff --git a/testmodule/providers/jsonrpc/testjson.nim b/testmodule/providers/jsonrpc/testjson.nim index 909be5b..1e9aa73 100644 --- a/testmodule/providers/jsonrpc/testjson.nim +++ b/testmodule/providers/jsonrpc/testjson.nim @@ -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