use crate::orchestrator::Orchestrator;
use crate::phases::{PhaseContext, PhaseFn, PhaseOutcome};
use std::collections::HashMap;
#[derive(Default)]
pub struct PhaseRegistry {
phases: Vec<PhaseFn>,
#[allow(dead_code)]
map: HashMap<String, usize>,
}
impl PhaseRegistry {
pub fn new() -> Self {
Self::default()
}
pub fn register(&mut self, name: impl Into<String>, phase: PhaseFn) {
let idx = self.phases.len();
self.map.insert(name.into(), idx);
self.phases.push(phase);
}
pub fn iter(&self) -> impl Iterator<Item = &PhaseFn> {
self.phases.iter()
}
}
pub async fn run_all_registered(
orch: &Orchestrator,
registry: &PhaseRegistry,
) -> Result<(), crate::error::Error> {
let mut ctx = PhaseContext::new(orch.services_arc());
for phase in registry.iter() {
match phase(orch, &mut ctx).await {
PhaseOutcome::PhaseCompleted => {}
PhaseOutcome::PhaseEarlyExit => break,
PhaseOutcome::PhaseError(e) => return Err(e),
}
}
Ok(())
}