use super::Door;
use crate::bounded::Bounded;
use crate::closure::Closure;
use crate::explanation::{AnsweredOutput, ExplanationError, UniversalAnswer};
use crate::identity::OwnerFact;
use crate::kind::Kind;
use crate::plan::Plan;
pub(super) fn universal<K: Kind>(
door: &Door,
plan: &Plan<K>,
closure: &Closure<K::Role>,
assumptions: &[OwnerFact],
) -> Result<Vec<UniversalAnswer>, ExplanationError> {
let account = plan.account();
let dependencies =
Bounded::new(account.dependencies().to_vec()).map_err(ExplanationError::bounded)?;
let assumed = Bounded::new(assumptions.to_vec()).map_err(ExplanationError::bounded)?;
let outputs = Bounded::new(AnsweredOutput::roster(closure.rendered()))
.map_err(ExplanationError::bounded)?;
let producer = door.producer();
Ok(vec![
UniversalAnswer::Kind { name: K::NAME },
UniversalAnswer::Owner {
owner: OwnerFact {
home: producer.namespace,
name: producer.name,
},
},
UniversalAnswer::CausingDeclarations {
commitment: account.commitment(),
dependencies,
},
UniversalAnswer::Profile {
profile: plan.context().profile(),
},
UniversalAnswer::OutputAndDigest { outputs },
UniversalAnswer::Assumptions {
assumptions: assumed,
},
UniversalAnswer::Invalidators {
triggers: plan.invalidation().clone(),
},
UniversalAnswer::RelatedDispositions {
related: Bounded::empty(),
},
UniversalAnswer::Repairs {
repairs: Bounded::empty(),
},
])
}