use crate::descriptor::{ClaimRef, MutationPointRef, NameRefusal, NamespacedName};
use crate::identity::{ContentAddress, DomainTag, IdentityProfileVersion};
use crate::muterprater::OperatorFamilyRef;
#[path = "type_guard.rs"]
mod guard;
pub const MUTATION_POLICY_TAG: DomainTag =
DomainTag::declared("mutation-policy", IdentityProfileVersion::declared(1));
pub const MUTATION_ALTERNATIVE_TAG: DomainTag =
DomainTag::declared("mutation-alternative", IdentityProfileVersion::declared(1));
pub const EVALUATION_SURFACE_TAG: DomainTag =
DomainTag::declared("evaluation-surface", IdentityProfileVersion::declared(1));
pub const MUTATION_DISCOVERY_TAG: DomainTag =
DomainTag::declared("mutation-discovery", IdentityProfileVersion::declared(1));
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct EvaluationFamilyRef(NamespacedName);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct MutationPolicyId(ContentAddress);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct MutationPermission {
owner_claim: ClaimRef,
admitted_families: Vec<OperatorFamilyRef>,
}
#[must_use = "a refusal is the reason a mutation permission was not built"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PermissionRefusal {
NoOperatorFamily,
DuplicateOperatorFamily(OperatorFamilyRef),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct MutationPolicy {
family: EvaluationFamilyRef,
permissions: Vec<MutationPermission>,
identity: MutationPolicyId,
}
#[must_use = "a refusal is the reason a mutation policy was not built"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PolicyRefusal {
DuplicateClaim(ClaimRef),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct PolicyMembership {
policy: MutationPolicyId,
owner_claim: ClaimRef,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ActivationSite(NamespacedName);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct AlternativeDeclaration {
family: OperatorFamilyRef,
operation: Vec<u8>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum OwnerClaimMapping {
Mapped(ClaimRef),
OwnerUnmapped,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct DiscoveredMutationSite {
identity: MutationPointRef,
mapping: OwnerClaimMapping,
original_operation: Vec<u8>,
alternatives: Vec<AlternativeDeclaration>,
activation_site: ActivationSite,
}
#[must_use = "a refusal is the reason one discovered mutation site was not read"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DiscoveryRefusal {
EmptyOriginalOperation,
NoAlternative,
EmptyAlternative {
at: usize,
},
AlternativeIsOriginal {
at: usize,
},
DuplicateAlternativeMeaning {
at: usize,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MappedUnpermittedCause {
Claim(ClaimRef),
Family {
at: usize,
family: OperatorFamilyRef,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DiscoveryDisposition {
Mapped {
point: MutationPointRef,
},
OwnerUnmapped,
MappedUnpermitted {
cause: MappedUnpermittedCause,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct DiscoveryEntry {
site: DiscoveredMutationSite,
disposition: DiscoveryDisposition,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct MutationDiscoveryId(ContentAddress);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct MutationDiscoveryReading {
family: EvaluationFamilyRef,
policy: MutationPolicyId,
identity: MutationDiscoveryId,
entries: Vec<DiscoveryEntry>,
}
#[must_use = "a refusal is the reason no complete mutation discovery reading was lowered"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DiscoveryLoweringRefusal {
DuplicateSite {
at: usize,
point: MutationPointRef,
},
}
pub struct MutationSurfaceLowering {
discovery: MutationDiscoveryReading,
surface: EvaluationSurface,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct AlternativeId(ContentAddress);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct AdmittedAlternative {
identity: AlternativeId,
family: OperatorFamilyRef,
operation: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct MutationPoint {
identity: MutationPointRef,
membership: PolicyMembership,
original_operation: Vec<u8>,
admitted_alternatives: Vec<AdmittedAlternative>,
activation_site: ActivationSite,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct EvaluationSurfaceId(ContentAddress);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct EvaluationSurface {
family: EvaluationFamilyRef,
policy: MutationPolicyId,
identity: EvaluationSurfaceId,
points: Vec<MutationPoint>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PointCatalogPosture {
NoAdmittedPoints,
Mutable,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ActiveSelection {
surface: EvaluationSurfaceId,
point: MutationPointRef,
alternative: AlternativeId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ResolvedMutation<'surface> {
selection: ActiveSelection,
point: &'surface MutationPoint,
alternative: &'surface AdmittedAlternative,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct EvaluationDirective<'surface> {
resolved: Option<ResolvedMutation<'surface>>,
}
#[must_use = "a refusal is the reason an evaluation callable produced no observation"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum EvaluationCallRefusal {
NoMutationNotImplemented,
ActiveSelectionNotImplemented(ActiveSelection),
}
#[must_use = "a refusal is the reason a mutant was not selected"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SelectionRefusal {
SelectionFromAnotherSurface {
expected: EvaluationSurfaceId,
found: EvaluationSurfaceId,
},
NoSuchPoint(MutationPointRef),
NoSuchAlternative {
point: MutationPointRef,
alternative: AlternativeId,
},
}