From 7d93ca61688754a4d3cfa25d54f7f73a631a31fd Mon Sep 17 00:00:00 2001 From: coffeepots Date: Thu, 10 May 2018 14:09:44 +0100 Subject: [PATCH] Fixed parsing issue with forward decls --- eth-rpc/server/servertypes.nim | 38 ++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/eth-rpc/server/servertypes.nim b/eth-rpc/server/servertypes.nim index 321f496..fffe50e 100644 --- a/eth-rpc/server/servertypes.nim +++ b/eth-rpc/server/servertypes.nim @@ -44,12 +44,46 @@ proc fromJson(n: JsonNode, argName: string, result: var int) = n.kind.expect(JInt, argName) result = n.getInt() +# TODO: Why does compiler complain that result cannot be assigned to when using result: var int|var int64 +# TODO: Compiler requires forward decl when processing out of module +proc fromJson(n: JsonNode, argName: string, result: var uint64) +proc fromJson(n: JsonNode, argName: string, result: var byte) +proc fromJson(n: JsonNode, argName: string, result: var float) +proc fromJson(n: JsonNode, argName: string, result: var string) +proc fromJson[T](n: JsonNode, argName: string, result: var seq[T]) +proc fromJson[N, T](n: JsonNode, argName: string, result: var array[N, T]) + +# TODO: Why can't this be forward declared? Complains of lack of definition +proc fromJson[T: enum](n: JsonNode, argName: string, result: var T) = + n.kind.expect(JInt, argName) + result = n.getInt().T + +# TODO: Why can't this be forward declared? Complains of lack of definition +proc fromJson[T: object](n: JsonNode, argName: string, result: var T) = + for k, v in fieldpairs(result): + fromJson(n[k], k, v) + +proc fromJson(n: JsonNode, argName: string, result: var int64) = + n.kind.expect(JInt, argName) + result = n.getInt() + +proc fromJson(n: JsonNode, argName: string, result: var uint64) = + n.kind.expect(JInt, argName) + result = n.getInt().uint64 + proc fromJson(n: JsonNode, argName: string, result: var byte) = n.kind.expect(JInt, argName) let v = n.getInt() if v > 255 or v < 0: raise newException(ValueError, "Parameter \"" & argName & "\" value out of range for byte: " & $v) result = byte(v) +# TODO: Alow string input for UInt256? +#[ +proc fromJson(n: JsonNode, argName: string, result: var UInt256) = + n.kind.expect(JString, argName) + result = n.getStr().parse(Stint[256]) # TODO: Requires error checking? +]# + proc fromJson(n: JsonNode, argName: string, result: var float) = n.kind.expect(JFloat, argName) result = n.getFloat() @@ -67,10 +101,6 @@ proc fromJson[N, T](n: JsonNode, argName: string, result: var array[N, T]) = for i in 0 ..< n.len: fromJson(n[i], argName, result[i]) -proc fromJson[T: object](n: JsonNode, argName: string, result: var T) = - for k, v in fieldpairs(result): - fromJson(n[k], k, v) - proc unpackArg[T](argIdx: int, argName: string, argtype: typedesc[T], args: JsonNode): T = when argType is array or argType is seq: args[argIdx].kind.expect(JArray, argName)