//! 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(),
}
}
}