use crate::{helpers::Ctx, ErroredState, EvmErrored, EvmNeedsTx, NeedsTx, Trevm};
use revm::{
context::result::{EVMError, InvalidTransaction},
Database, Inspector,
};
impl<Db, Insp, E> EvmErrored<Db, Insp, E>
where
Db: Database,
Insp: Inspector<Ctx<Db>>,
{
pub const fn error(&self) -> &E {
&self.state.error
}
pub fn inspect_err<F, T>(&self, f: F) -> T
where
F: FnOnce(&E) -> T,
{
f(self.error())
}
pub fn discard_error(self) -> EvmNeedsTx<Db, Insp> {
Trevm { inner: self.inner, state: NeedsTx::new() }
}
pub fn into_error(self) -> E {
self.state.error
}
pub fn take_err(self) -> (E, EvmNeedsTx<Db, Insp>) {
let Self { inner, state: ErroredState { error } } = self;
(error, Trevm { inner, state: NeedsTx::new() })
}
pub fn err_into<NewErr: From<E>>(self) -> EvmErrored<Db, Insp, NewErr> {
self.map_err(Into::into)
}
pub fn map_err<F, NewErr>(self, f: F) -> EvmErrored<Db, Insp, NewErr>
where
F: FnOnce(E) -> NewErr,
{
Trevm { inner: self.inner, state: ErroredState { error: f(self.state.error) } }
}
}
impl<Db, Insp> EvmErrored<Db, Insp>
where
Db: Database,
Insp: Inspector<Ctx<Db>>,
{
pub const fn is_transaction_error(&self) -> bool {
matches!(self.state.error, EVMError::Transaction(_))
}
pub const fn as_transaction_error(&self) -> Option<&InvalidTransaction> {
match &self.state.error {
EVMError::Transaction(err) => Some(err),
_ => None,
}
}
pub fn discard_transaction_error(self) -> Result<EvmNeedsTx<Db, Insp>, Self> {
if self.is_transaction_error() {
Ok(self.discard_error())
} else {
Err(self)
}
}
}