use crate::{driver::BundleDriver, BlockDriver, ChainDriver, Trevm};
use revm::{context::result::EVMError, inspector::NoOpInspector, Database};
use sealed::*;
pub type EvmNeedsCfg<Db, Insp = NoOpInspector> = Trevm<Db, Insp, NeedsCfg>;
pub type EvmNeedsBlock<Db, Insp = NoOpInspector> = Trevm<Db, Insp, NeedsBlock>;
pub type EvmNeedsTx<Db, Insp = NoOpInspector> = Trevm<Db, Insp, NeedsTx>;
pub type EvmReady<Db, Insp = NoOpInspector> = Trevm<Db, Insp, Ready>;
pub type EvmTransacted<Db, Insp = NoOpInspector> = Trevm<Db, Insp, TransactedState>;
pub type EvmErrored<Db, Insp = NoOpInspector, E = EVMError<<Db as Database>::Error>> =
Trevm<Db, Insp, ErroredState<E>>;
pub type EvmBlockDriverErrored<T, Db, Insp = NoOpInspector> =
EvmErrored<Db, Insp, <T as BlockDriver<Db, Insp>>::Error>;
pub type EvmChainDriverErrored<T, Db, Insp = NoOpInspector> =
EvmErrored<Db, Insp, <T as ChainDriver<Db, Insp>>::Error>;
pub type EvmBundleDriverErrored<T, Db, Insp = NoOpInspector> =
EvmErrored<Db, Insp, <T as BundleDriver<Db, Insp>>::Error>;
#[allow(unnameable_types, dead_code, unreachable_pub)]
pub(crate) mod sealed {
use revm::context::result::ResultAndState;
macro_rules! states {
($($name:ident),+) => {
$(
#[derive(Debug, Copy, Clone)]
pub struct $name { _private: () }
impl $name {
pub(crate) const fn new() -> Self {
Self { _private: () }
}
}
)*
};
}
states!(NeedsCfg, NeedsBlock, NeedsTx, Ready);
#[derive(Debug, Clone)]
pub struct TransactedState {
pub result: ResultAndState,
}
#[derive(Debug, Copy, Clone)]
pub struct ErroredState<E> {
pub error: E,
}
pub struct Seal;
pub trait HasCfg {}
impl HasCfg for NeedsBlock {}
impl HasCfg for NeedsTx {}
impl HasCfg for TransactedState {}
impl<E> HasCfg for ErroredState<E> {}
impl HasCfg for Ready {}
pub trait HasBlock: HasCfg {}
impl HasBlock for NeedsTx {}
impl HasBlock for TransactedState {}
impl<E> HasBlock for ErroredState<E> {}
impl HasBlock for Ready {}
pub trait HasTx: HasBlock + HasCfg {}
impl HasTx for TransactedState {}
impl<E> HasTx for ErroredState<E> {}
impl HasTx for Ready {}
}
#[macro_export]
macro_rules! trevm_aliases {
($db:ty) => {
trevm_aliases!((), $db);
};
($db:ty, $insp:ty) => {
#[allow(unused_imports, unreachable_pub, dead_code)]
pub use __aliases::*;
#[allow(unused_imports, unreachable_pub, dead_code)]
mod __aliases {
use super::*;
use $crate::{Block, BlockDriver, ChainDriver, Trevm, Tx};
pub type EvmNeedsCfg = $crate::EvmNeedsCfg<$db, $insp>;
pub type EvmNeedsBlock = $crate::EvmNeedsBlock<$db, $insp>;
pub type EvmNeedsTx = $crate::EvmNeedsTx<$db, $insp>;
pub type EvmReady = $crate::EvmReady<$db, $insp>;
pub type EvmTransacted = $crate::EvmTransacted<$db, $insp>;
pub type EvmErrored<E> = $crate::EvmErrored<$db, $insp, E>;
pub type EvmBlockDriverErrored<T> = $crate::EvmBlockDriverErrored<$db, $insp, T>;
pub type EvmChainDriverErrored<T> = $crate::EvmChainDriverErrored<$db, $insp, T>;
pub type EvmBundleDriverErrored<T> = $crate::EvmBundleDriverErrored<$db, $insp, T>;
}
};
}