use noether_core::stage::{SignatureId, Stage, StageId, StageLifecycle};
use std::collections::HashMap;
pub(crate) fn duplicate_active_ids_for(
stages: &HashMap<String, Stage>,
exclude_id: &StageId,
signature_id: Option<&SignatureId>,
) -> Vec<StageId> {
let sig = match signature_id {
Some(s) => s,
None => return Vec::new(),
};
stages
.values()
.filter(|s| {
s.id != *exclude_id
&& matches!(s.lifecycle, StageLifecycle::Active)
&& s.signature_id.as_ref() == Some(sig)
})
.map(|s| s.id.clone())
.collect()
}
pub(crate) fn duplicate_active_ids_for_incoming(
stages: &HashMap<String, Stage>,
incoming: &Stage,
) -> Vec<StageId> {
if !matches!(incoming.lifecycle, StageLifecycle::Active) {
return Vec::new();
}
duplicate_active_ids_for(stages, &incoming.id, incoming.signature_id.as_ref())
}
pub(crate) fn log_auto_deprecation(
deprecated_ids: &[StageId],
successor: &StageId,
signature_id: Option<&SignatureId>,
) {
for old in deprecated_ids {
tracing::warn!(
target: "noether_store::invariant",
deprecated_stage_id = %old.0,
successor_stage_id = %successor.0,
signature_id = signature_id.map(|s| s.0.as_str()).unwrap_or(""),
"auto-deprecated Active stage: another Active stage shares its signature_id"
);
}
}