use crate::core::types::*;
use std::collections::HashSet;
pub fn propagate_changes(
config: &ForjarConfig,
execution_order: &[String],
changes: &mut [PlannedChange],
) -> u32 {
let mut promoted = 0u32;
let mut dirty: HashSet<String> = changes
.iter()
.filter(|c| c.action != PlanAction::NoOp)
.map(|c| c.resource_id.clone())
.collect();
for resource_id in execution_order {
if dirty.contains(resource_id) {
continue;
}
let Some(resource) = config.resources.get(resource_id) else {
continue;
};
let Some(trigger) = resource
.depends_on
.iter()
.find(|dep: &&String| dirty.contains(dep.as_str()))
else {
continue;
};
let trigger = trigger.clone();
for change in changes.iter_mut() {
if change.resource_id == *resource_id && change.action == PlanAction::NoOp {
change.action = PlanAction::Update;
change.description =
format!("{resource_id}: rebuild — dependency {trigger} changed");
promoted += 1;
dirty.insert(resource_id.clone());
}
}
}
promoted
}