use crate::{helpers::Ctx, BlockDriver, EvmChainDriverErrored, EvmNeedsBlock};
use revm::{
context::result::EVMError, inspector::NoOpInspector, primitives::hardfork::SpecId, Database,
DatabaseCommit, Inspector,
};
pub type DriveChainResult<D, Db, Insp> =
Result<EvmNeedsBlock<Db, Insp>, EvmChainDriverErrored<D, Db, Insp>>;
pub trait ChainDriver<Db, Insp = NoOpInspector>
where
Db: Database + DatabaseCommit,
Insp: Inspector<Ctx<Db>>,
{
type BlockDriver: BlockDriver<Db, Insp>;
type Error: core::error::Error
+ From<EVMError<Db::Error>>
+ From<<Self::BlockDriver as BlockDriver<Db, Insp>>::Error>;
fn spec_id_for(&self, block: &<Self::BlockDriver as BlockDriver<Db, Insp>>::Block) -> SpecId;
fn blocks(&mut self) -> &mut [Self::BlockDriver];
fn interblock(
&mut self,
trevm: &EvmNeedsBlock<Db, Insp>,
idx: usize,
) -> Result<(), Self::Error>;
}