use camino::Utf8Path;
use crate::error::AppError;
use crate::plan::classify::Intent;
use crate::plan::observe::observe;
pub fn serves(intent: Intent, target: &Utf8Path) -> Result<(), AppError> {
if !target.exists() {
return Ok(());
}
let observation = observe(target)?;
let found = crate::plan::classify::classify(crate::plan::classify::Signals {
invalid: observation.invalid.is_some(),
installed: observation.installation.is_some(),
at_destination: observation.installation.as_ref().is_some_and(|installed| {
installed.canon_version == crate::domain::version::CanonVersion::current()
}),
drifted: observation
.installation
.as_ref()
.is_some_and(crate::plan::observe::Installation::drifted),
settled: observation.corpus.settled(),
});
intent
.accepts(found)
.map_err(|refusal| AppError::Refused(refusal.to_string()))
}