From 798e86112c9972fb0d60f929bc17ed55a1281b68 Mon Sep 17 00:00:00 2001 From: coffeepots Date: Mon, 26 Nov 2018 18:03:56 +0000 Subject: [PATCH] Cover optional cases within objects --- json_rpc/jsonmarshal.nim | 5 ++++- tests/testrpcmacro.nim | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/json_rpc/jsonmarshal.nim b/json_rpc/jsonmarshal.nim index e7e35e0..6c4bf03 100644 --- a/json_rpc/jsonmarshal.nim +++ b/json_rpc/jsonmarshal.nim @@ -44,7 +44,10 @@ proc fromJson[T: enum](n: JsonNode, argName: string, result: var T) = proc fromJson[T: object](n: JsonNode, argName: string, result: var T) = n.kind.expect(JObject, argName) for k, v in fieldPairs(result): - fromJson(n[k], k, v) + if v is Option and not n.hasKey(k): + fromJson(newJNull(), k, v) + else: + fromJson(n[k], k, v) proc fromJson[T](n: JsonNode, argName: string, result: var Option[T]) = # Allow JNull for options diff --git a/tests/testrpcmacro.nim b/tests/testrpcmacro.nim index 65b1bce..f578c10 100644 --- a/tests/testrpcmacro.nim +++ b/tests/testrpcmacro.nim @@ -105,6 +105,19 @@ s.rpc("rpc.optionalArgNotBuiltin") do(obj: Option[MyOptionalNotBuiltin]) -> stri if val.isSome: result = obj.get.val.get.y +type + MaybeOptions = object + o1: Option[bool] + o2: Option[bool] + o3: Option[bool] + +s.rpc("rpc.optInObj") do(data: string, options: Option[MaybeOptions]) -> int: + if options.isSome: + let o = options.get + if o.o1.isSome: result += 1 + if o.o2.isSome: result += 2 + if o.o3.isSome: result += 4 + # Tests suite "Server types": test "On macro registration": @@ -118,6 +131,9 @@ suite "Server types": check s.hasMethod("rpc.testreturns") check s.hasMethod("rpc.multivarsofonetype") check s.hasMethod("rpc.optionalArg") + check s.hasMethod("rpc.mixedOptionalArg") + check s.hasMethod("rpc.optionalArgNotBuiltin") + check s.hasMethod("rpc.traceTransaction") test "Simple paths": let r = waitFor rpcSimplePath(%[]) @@ -216,6 +232,12 @@ suite "Server types": var r3 = waitFor rpcOptionalArgNotBuiltin(%[%testOpts2]) check r3 == %"Empty2" + test "Manually set up JSON for optionals": + # Check manual set up json with optionals + let opts = parseJson("""{"o2": true}""") + var r = waitFor rpcOptInObj(%[%"0x31ded", opts]) + check r == %2 + s.stop() waitFor s.closeWait()