# Nimbus
# Copyright (c) 2018-2024 Status Research & Development GmbH
# Licensed under either of
#  * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
#    http://www.apache.org/licenses/LICENSE-2.0)
#  * MIT license ([LICENSE-MIT](LICENSE-MIT) or
#    http://opensource.org/licenses/MIT)
# at your option. This file may not be copied, modified, or distributed except
# according to those terms.

{.push raises: [].}

import
  results

export
  results

type
  EvmErrorCode* {.pure.} = enum
    EvmBug
    OutOfGas
    MemoryFull
    StackFull
    StackInsufficient
    PrcInvalidSig
    PrcInvalidPoint
    PrcInvalidParam
    PrcValidationError
    GasIntOverflow
    InvalidInstruction
    StaticContext
    InvalidJumpDest
    OutOfBounds
    InvalidInitCode
    EvmHeaderNotFound
    EvmInvalidParam

  EvmErrorObj* = object
    code*: EvmErrorCode

  EvmResultVoid* = Result[void, EvmErrorObj]
  EvmResult*[T] = Result[T, EvmErrorObj]

template gasErr*(errCode): auto =
  EvmErrorObj(
    code: EvmErrorCode.errCode,
  )

template memErr*(errCode): auto =
  EvmErrorObj(
    code: EvmErrorCode.errCode,
  )

template stackErr*(errCode): auto =
  EvmErrorObj(
    code: EvmErrorCode.errCode,
  )

template prcErr*(errCode): auto =
  EvmErrorObj(
    code: EvmErrorCode.errCode,
  )

template opErr*(errCode): auto =
  EvmErrorObj(
    code: EvmErrorCode.errCode,
  )

template evmErr*(errCode): auto =
  EvmErrorObj(
    code: EvmErrorCode.errCode,
  )