//! Helper type that represents one of two possible executor types use core::fmt::Display; use crate::execute::{BatchExecutor, BlockExecutorProvider, Executor}; use reth_execution_errors::BlockExecutionError; use reth_execution_types::{BlockExecutionInput, BlockExecutionOutput, ExecutionOutcome}; use reth_primitives::{BlockNumber, BlockWithSenders, Receipt}; use reth_prune_types::PruneModes; use reth_storage_errors::provider::ProviderError; 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 + Display>> = Either, B::Executor>; type BatchExecutor + Display>> = Either, B::BatchExecutor>; fn executor(&self, db: DB) -> Self::Executor where DB: Database + Display>, { match self { Self::Left(a) => Either::Left(a.executor(db)), Self::Right(b) => Either::Right(b.executor(db)), } } fn batch_executor(&self, db: DB) -> Self::BatchExecutor where DB: Database + Display>, { match self { Self::Left(a) => Either::Left(a.batch_executor(db)), Self::Right(b) => Either::Right(b.batch_executor(db)), } } } 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 + Display>, { type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; type Output = BlockExecutionOutput; type Error = BlockExecutionError; fn execute(self, input: Self::Input<'_>) -> Result { match self { Self::Left(a) => a.execute(input), Self::Right(b) => b.execute(input), } } } impl BatchExecutor for Either where A: for<'a> BatchExecutor< DB, Input<'a> = BlockExecutionInput<'a, BlockWithSenders>, Output = ExecutionOutcome, Error = BlockExecutionError, >, B: for<'a> BatchExecutor< DB, Input<'a> = BlockExecutionInput<'a, BlockWithSenders>, Output = ExecutionOutcome, Error = BlockExecutionError, >, DB: Database + Display>, { type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; type Output = ExecutionOutcome; type Error = BlockExecutionError; fn execute_and_verify_one(&mut self, input: Self::Input<'_>) -> Result<(), Self::Error> { match self { Self::Left(a) => a.execute_and_verify_one(input), Self::Right(b) => b.execute_and_verify_one(input), } } fn finalize(self) -> Self::Output { match self { Self::Left(a) => a.finalize(), Self::Right(b) => b.finalize(), } } fn set_tip(&mut self, tip: BlockNumber) { match self { Self::Left(a) => a.set_tip(tip), Self::Right(b) => b.set_tip(tip), } } fn set_prune_modes(&mut self, prune_modes: PruneModes) { match self { Self::Left(a) => a.set_prune_modes(prune_modes), Self::Right(b) => b.set_prune_modes(prune_modes), } } fn size_hint(&self) -> Option { match self { Self::Left(a) => a.size_hint(), Self::Right(b) => b.size_hint(), } } }