Move contract error handling into its own modules

This commit is contained in:
Mark Spanbroek 2025-04-10 09:46:23 +02:00 committed by markspanbroek
parent e37f454761
commit 4441050c3d
6 changed files with 37 additions and 34 deletions

View File

@ -1,5 +1,5 @@
import ../provider
import ../errors/conversion
import ./errors/conversion
{.push raises: [].}

View File

@ -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

View File

@ -1,5 +1,5 @@
import ../basics
import ../provider
import ../../basics
import ../../provider
import ./encoding
type ConvertCustomErrors* =

View File

@ -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):

View File

@ -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:

View File

@ -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":