reth_stages_api/pipeline/ctrl.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
use alloy_eips::eip1898::BlockWithParent;
use alloy_primitives::BlockNumber;
/// Determines the control flow during pipeline execution.
///
/// See [`Pipeline::run_loop`](crate::Pipeline::run_loop) for more information.
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum ControlFlow {
/// An unwind was requested and must be performed before continuing.
Unwind {
/// The block to unwind to.
target: BlockNumber,
/// The block that caused the unwind.
bad_block: Box<BlockWithParent>,
},
/// The pipeline made progress.
Continue {
/// Block number reached by the stage.
block_number: BlockNumber,
},
/// Pipeline made no progress
NoProgress {
/// Block number reached by the stage.
block_number: Option<BlockNumber>,
},
}
impl ControlFlow {
/// Whether the pipeline should continue executing stages.
pub const fn should_continue(&self) -> bool {
matches!(self, Self::Continue { .. } | Self::NoProgress { .. })
}
/// Returns true if the control flow is unwind.
pub const fn is_unwind(&self) -> bool {
matches!(self, Self::Unwind { .. })
}
/// Returns the pipeline block number the stage reached, if the state is not `Unwind`.
pub const fn block_number(&self) -> Option<BlockNumber> {
match self {
Self::Unwind { .. } => None,
Self::Continue { block_number } => Some(*block_number),
Self::NoProgress { block_number } => *block_number,
}
}
}