use crate::actions; use crate::context::SproutContext; use anyhow::Context; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::rc::Rc; #[derive(Serialize, Deserialize, Default, Clone)] pub struct PhasesConfiguration { #[serde(default)] pub early: Vec, #[serde(default)] pub startup: Vec, #[serde(default)] pub late: Vec, } #[derive(Serialize, Deserialize, Default, Clone)] pub struct PhaseConfiguration { #[serde(default)] pub actions: Vec, #[serde(default)] pub values: BTreeMap, } pub fn phase(context: Rc, phase: &[PhaseConfiguration]) -> anyhow::Result<()> { for item in phase { let mut context = context.fork(); context.insert(&item.values); let context = context.freeze(); for action in item.actions.iter() { actions::execute(context.clone(), action) .context(format!("unable to execute action '{}'", action))?; } } Ok(()) }