//! Helper type that represents one of two possible executor types use crate::execute::{ BatchBlockExecutionOutput, BatchExecutor, BlockExecutionInput, BlockExecutionOutput, BlockExecutorProvider, Executor, }; use reth_interfaces::{executor::BlockExecutionError, provider::ProviderError}; use reth_primitives::{BlockNumber, BlockWithSenders, PruneModes, Receipt}; use revm_primitives::db::Database; // re-export Either pub use futures_util::future::Either; impl BlockExecutorProvider for Either where A: BlockExecutorProvider, B: BlockExecutorProvider, { type Executor> = Either, B::Executor>; type BatchExecutor> = Either, B::BatchExecutor>; fn executor(&self, db: DB) -> Self::Executor where DB: Database, { match self { Either::Left(a) => Either::Left(a.executor(db)), Either::Right(b) => Either::Right(b.executor(db)), } } fn batch_executor(&self, db: DB, prune_modes: PruneModes) -> Self::BatchExecutor where DB: Database, { match self { Either::Left(a) => Either::Left(a.batch_executor(db, prune_modes)), Either::Right(b) => Either::Right(b.batch_executor(db, prune_modes)), } } } impl Executor for Either where A: for<'a> Executor< DB, Input<'a> = BlockExecutionInput<'a, BlockWithSenders>, Output = BlockExecutionOutput, Error = BlockExecutionError, >, B: for<'a> Executor< DB, Input<'a> = BlockExecutionInput<'a, BlockWithSenders>, Output = BlockExecutionOutput, Error = BlockExecutionError, >, DB: Database, { type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; type Output = BlockExecutionOutput; type Error = BlockExecutionError; fn execute(self, input: Self::Input<'_>) -> Result { match self { Either::Left(a) => a.execute(input), Either::Right(b) => b.execute(input), } } } impl BatchExecutor for Either where A: for<'a> BatchExecutor< DB, Input<'a> = BlockExecutionInput<'a, BlockWithSenders>, Output = BatchBlockExecutionOutput, Error = BlockExecutionError, >, B: for<'a> BatchExecutor< DB, Input<'a> = BlockExecutionInput<'a, BlockWithSenders>, Output = BatchBlockExecutionOutput, Error = BlockExecutionError, >, DB: Database, { type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; type Output = BatchBlockExecutionOutput; type Error = BlockExecutionError; fn execute_one(&mut self, input: Self::Input<'_>) -> Result<(), Self::Error> { match self { Either::Left(a) => a.execute_one(input), Either::Right(b) => b.execute_one(input), } } fn finalize(self) -> Self::Output { match self { Either::Left(a) => a.finalize(), Either::Right(b) => b.finalize(), } } fn set_tip(&mut self, tip: BlockNumber) { match self { Either::Left(a) => a.set_tip(tip), Either::Right(b) => b.set_tip(tip), } } fn size_hint(&self) -> Option { match self { Either::Left(a) => a.size_hint(), Either::Right(b) => b.size_hint(), } } }