use super::types::{
ArtifactMutation, RewriteAdmission, RewriteCandidate, RewriteRoster, RewriteWithheld,
};
use crate::depot::operator_families::OPERATOR_FAMILIES;
use crate::depot::types::OperatorFamily;
use crate::muterprater::{InterpreterAvailability, ScopeShape};
macro_rules! describe_artifact_mutations {
($( $(#[$variant_doc:meta])* $variant:ident => $description:literal, )+) => {
impl ArtifactMutation {
#[must_use]
pub const fn described(self) -> &'static str {
match self {
$(
Self::$variant => $description,
)+
}
}
}
};
}
crate::depot::artifact_mutation_bank!(describe_artifact_mutations);
#[must_use]
pub fn planned(roster: &RewriteRoster, scope: &ScopeShape) -> Vec<RewriteCandidate> {
roster
.descriptors()
.iter()
.map(|descriptor| RewriteCandidate::planned(*descriptor, scope.clone()))
.collect()
}
#[must_use]
pub fn admission<Input, Meaning>(
interpreter: &InterpreterAvailability<'_, '_, '_, '_, '_, '_, Input, Meaning>,
) -> RewriteAdmission {
match interpreter {
InterpreterAvailability::Available(_) => RewriteAdmission::Admitted,
InterpreterAvailability::NoConformingSurface => {
RewriteAdmission::Withheld(RewriteWithheld::InterpreterUnavailable)
}
InterpreterAvailability::TrustNotOpened { missing } => {
RewriteAdmission::Withheld(RewriteWithheld::TrustNotOpened(*missing))
}
}
}
#[must_use]
pub fn unrealized_families(roster: &RewriteRoster) -> Vec<OperatorFamily> {
OPERATOR_FAMILIES
.iter()
.copied()
.filter(|family| {
!roster
.descriptors()
.iter()
.any(|descriptor| descriptor.family().slug() == family.slug())
})
.collect()
}