netspeed_cli/
phase_registry.rs1use crate::orchestrator::Orchestrator;
3use crate::phases::{PhaseContext, PhaseFn, PhaseOutcome};
4use std::collections::HashMap;
5#[derive(Default)]
9pub struct PhaseRegistry {
10 phases: Vec<PhaseFn>,
11 #[allow(dead_code)]
13 map: HashMap<String, usize>,
14}
15
16impl PhaseRegistry {
17 pub fn new() -> Self {
19 Self::default()
20 }
21
22 pub fn register(&mut self, name: impl Into<String>, phase: PhaseFn) {
24 let idx = self.phases.len();
25 self.map.insert(name.into(), idx);
26 self.phases.push(phase);
27 }
28
29 pub fn iter(&self) -> impl Iterator<Item = &PhaseFn> {
31 self.phases.iter()
32 }
33}
34
35pub async fn run_all_registered(
37 orch: &Orchestrator,
38 registry: &PhaseRegistry,
39) -> Result<(), crate::error::Error> {
40 let mut ctx = PhaseContext::new(orch.services_arc());
41 for phase in registry.iter() {
42 match phase(orch, &mut ctx).await {
43 PhaseOutcome::PhaseCompleted => {}
44 PhaseOutcome::PhaseEarlyExit => break,
45 PhaseOutcome::PhaseError(e) => return Err(e),
46 }
47 }
48 Ok(())
49}