use crate::fleet_ensure::{
model::{CanisterPlan, DesiredFleet, EnsureAction, EstateFundingDomainPlan},
policy::EnsurePolicyError,
};
use std::collections::BTreeSet;
pub fn validate_creation_fee_scope(
desired: &DesiredFleet,
canisters: &[CanisterPlan],
domains: &[EstateFundingDomainPlan],
) -> Result<(), EnsurePolicyError> {
let mut subnets = BTreeSet::new();
for action in canisters.iter().flat_map(|canister| &canister.actions) {
if let EnsureAction::Create { subnet, .. } = action {
subnets.insert(subnet.clone());
}
}
for domain in domains {
if domain.required_creation_count == 0 && domain.pending_creation_count == 0 {
continue;
}
let root = desired
.canisters
.iter()
.find(|canister| canister.name == domain.root)
.ok_or_else(|| EnsurePolicyError::EstateFundingTopology {
reason: format!("creation forecast has no declared Root {}", domain.root),
})?;
subnets.insert(root.subnet.clone());
}
if subnets.len() > 1 {
return Err(EnsurePolicyError::MixedSubnetCreationFees {
subnets: subnets.into_iter().collect(),
});
}
Ok(())
}