//! A no operation block executor implementation. use core::fmt::Display; 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; use crate::execute::{BatchExecutor, BlockExecutorProvider, Executor}; const UNAVAILABLE_FOR_NOOP: &str = "execution unavailable for noop"; /// A [`BlockExecutorProvider`] implementation that does nothing. #[derive(Debug, Default, Clone)] #[non_exhaustive] pub struct NoopBlockExecutorProvider; impl BlockExecutorProvider for NoopBlockExecutorProvider { type Executor + Display>> = Self; type BatchExecutor + Display>> = Self; fn executor(&self, _: DB) -> Self::Executor where DB: Database + Display>, { Self } fn batch_executor(&self, _: DB) -> Self::BatchExecutor where DB: Database + Display>, { Self } } impl Executor for NoopBlockExecutorProvider { type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; type Output = BlockExecutionOutput; type Error = BlockExecutionError; fn execute(self, _: Self::Input<'_>) -> Result { Err(BlockExecutionError::msg(UNAVAILABLE_FOR_NOOP)) } } impl BatchExecutor for NoopBlockExecutorProvider { type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; type Output = ExecutionOutcome; type Error = BlockExecutionError; fn execute_and_verify_one(&mut self, _: Self::Input<'_>) -> Result<(), Self::Error> { Err(BlockExecutionError::msg(UNAVAILABLE_FOR_NOOP)) } fn finalize(self) -> Self::Output { unreachable!() } fn set_tip(&mut self, _: BlockNumber) {} fn set_prune_modes(&mut self, _: PruneModes) {} fn size_hint(&self) -> Option { None } }