use crate::{helpers::Ctx, Block, EvmBlockDriverErrored, EvmNeedsBlock, EvmNeedsTx};
use revm::{
context::result::EVMError, inspector::NoOpInspector, Database, DatabaseCommit, Inspector,
};
pub type RunTxResult<T, Db, Insp> =
Result<EvmNeedsTx<Db, Insp>, EvmBlockDriverErrored<T, Db, Insp>>;
pub type DriveBlockResult<T, Db, Insp> =
Result<EvmNeedsBlock<Db, Insp>, EvmBlockDriverErrored<T, Db, Insp>>;
pub trait BlockDriver<Db, Insp = NoOpInspector>
where
Db: Database + DatabaseCommit,
Insp: Inspector<Ctx<Db>>,
{
type Block: Block;
type Error: core::error::Error + From<EVMError<Db::Error>>;
fn block(&self) -> &Self::Block;
fn run_txns(&mut self, trevm: EvmNeedsTx<Db, Insp>) -> RunTxResult<Self, Db, Insp>;
fn post_block(&mut self, trevm: &EvmNeedsBlock<Db, Insp>) -> Result<(), Self::Error>;
}