diff --git a/ethers/contracts/confirmation.nim b/ethers/contracts/confirmation.nim index a2d2265..ff82d0e 100644 --- a/ethers/contracts/confirmation.nim +++ b/ethers/contracts/confirmation.nim @@ -1,5 +1,5 @@ import ../provider -import ../errors/conversion +import ./errors/conversion {.push raises: [].} diff --git a/ethers/contracts/errors.nim b/ethers/contracts/errors.nim new file mode 100644 index 0000000..e824d38 --- /dev/null +++ b/ethers/contracts/errors.nim @@ -0,0 +1,29 @@ +import std/macros +import ./errors/conversion + +func getErrorTypes*(procedure: NimNode): NimNode = + let pragmas = procedure[4] + var tupl = newNimNode(nnkTupleConstr) + for pragma in pragmas: + if pragma.kind == nnkExprColonExpr: + if pragma[0].eqIdent "errors": + pragma[1].expectKind(nnkBracket) + for error in pragma[1]: + tupl.add error + if tupl.len == 0: + quote do: tuple[] + else: + tupl + +func addErrorHandling*(procedure: var NimNode) = + let body = procedure[6] + let errors = getErrorTypes(procedure) + procedure.body = quote do: + try: + `body` + except ProviderError as error: + if data =? error.data: + let convert = customErrorConversion(`errors`) + raise convert(error) + else: + raise error diff --git a/ethers/errors/conversion.nim b/ethers/contracts/errors/conversion.nim similarity index 90% rename from ethers/errors/conversion.nim rename to ethers/contracts/errors/conversion.nim index 9cb3d90..0c585d6 100644 --- a/ethers/errors/conversion.nim +++ b/ethers/contracts/errors/conversion.nim @@ -1,5 +1,5 @@ -import ../basics -import ../provider +import ../../basics +import ../../provider import ./encoding type ConvertCustomErrors* = diff --git a/ethers/errors/encoding.nim b/ethers/contracts/errors/encoding.nim similarity index 96% rename from ethers/errors/encoding.nim rename to ethers/contracts/errors/encoding.nim index fda37d9..099f359 100644 --- a/ethers/errors/encoding.nim +++ b/ethers/contracts/errors/encoding.nim @@ -1,7 +1,7 @@ import pkg/contractabi import pkg/contractabi/selector -import ../basics -import ../errors +import ../../basics +import ../../errors func selector(E: type): FunctionSelector = when compiles(E.arguments): diff --git a/ethers/contracts/function.nim b/ethers/contracts/function.nim index 3fc390f..26fe46f 100644 --- a/ethers/contracts/function.nim +++ b/ethers/contracts/function.nim @@ -1,21 +1,8 @@ import std/macros -import ../errors/conversion +import ./errors/conversion import ./syntax import ./transactions - -func getErrorTypes(procedure: NimNode): NimNode = - let pragmas = procedure[4] - var tupl = newNimNode(nnkTupleConstr) - for pragma in pragmas: - if pragma.kind == nnkExprColonExpr: - if pragma[0].eqIdent "errors": - pragma[1].expectKind(nnkBracket) - for error in pragma[1]: - tupl.add error - if tupl.len == 0: - quote do: tuple[] - else: - tupl +import ./errors func addContractCall(procedure: var NimNode) = let contractCall = getContractCall(procedure) @@ -58,19 +45,6 @@ func addContractCall(procedure: var NimNode) = else: send() -func addErrorHandling(procedure: var NimNode) = - let body = procedure[6] - let errors = getErrorTypes(procedure) - procedure.body = quote do: - try: - `body` - except ProviderError as error: - if data =? error.data: - let convert = customErrorConversion(`errors`) - raise convert(error) - else: - raise error - func addFuture(procedure: var NimNode) = let returntype = procedure[3][0] if returntype.kind != nnkEmpty: diff --git a/testmodule/testErrorDecoding.nim b/testmodule/testErrorDecoding.nim index 8ae4cea..982928f 100644 --- a/testmodule/testErrorDecoding.nim +++ b/testmodule/testErrorDecoding.nim @@ -3,7 +3,7 @@ import std/strutils import pkg/questionable/results import pkg/contractabi import pkg/ethers/errors -import pkg/ethers/errors/encoding +import pkg/ethers/contracts/errors/encoding suite "Decoding of custom errors":