use crate::descriptor::{GeneratedSupportSchemaId, NamespacedName, RevisionBinding};
use crate::report::{
Fingerprint, GenerationProfile, MinimizationProfile, ReplayPosture, TrialRunStanding,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ByteReducerId {
ChunkRemovalAndZeroing,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SemanticReducerId(NamespacedName);
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SemanticCandidates {
candidates: Vec<Vec<u8>>,
}
#[must_use = "a refusal is the reason semantic candidates were not built"]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SemanticCandidateRefusal {
NotStrictlySmaller {
position: usize,
predecessor_bytes: usize,
candidate_bytes: usize,
},
}
pub type SemanticReducerCall = fn(&[u8]) -> Result<SemanticCandidates, SemanticCandidateRefusal>;
#[derive(Debug, Clone, Copy)]
pub struct SemanticReducerBinding {
reducer: SemanticReducerId,
revision: RevisionBinding,
call: SemanticReducerCall,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SemanticReducerExecution {
reducer: SemanticReducerId,
revision: RevisionBinding,
candidates: usize,
probes: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ByteReducerExecution {
Executed(ByteReducerId),
NotReachedBecauseBudgetSpent,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum FingerprintPreservation {
Required,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ReductionBudget(u32);
#[derive(Debug, Clone)]
pub struct ReductionPlan {
profile: MinimizationProfile,
byte_reducer: ByteReducerId,
semantic_reducers: Vec<SemanticReducerBinding>,
preservation: FingerprintPreservation,
budget: ReductionBudget,
}
#[must_use = "a refusal is the reason a reduction plan was not built"]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReductionPlanRefusal {
ZeroReductionBudget,
DuplicateSemanticReducer(SemanticReducerId),
}
pub struct ReductionProbeBinding {
standing: TrialRunStanding,
preserved: Fingerprint,
generation: GenerationProfile,
schema: GeneratedSupportSchemaId,
revision: RevisionBinding,
probe: FingerprintProbe,
}
#[must_use = "a refusal is the reason a reduction probe binding was not built"]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReductionProbeRefusal {
TrialDidNotConclude,
TrialPassed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ProbeOutcome {
Reproduced(Fingerprint),
NoFailure,
}
pub type FingerprintProbe = fn(&[u8]) -> ProbeOutcome;
macro_rules! with_shrink_verdicts {
($callback:ident) => {
$callback! {
Accepted => accepted,
RejectedFingerprintMoved {
found: Fingerprint,
} => fingerprint_moved,
RejectedNoFailure => no_failure,
}
};
}
macro_rules! declare_reduction_census {
(
$(
$(#[$variant_meta:meta])*
$variant:ident
$( { $( $(#[$field_meta:meta])* $field:ident: $field_type:ty, )+ } )?
=> $seat:ident,
)+
) => {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ShrinkVerdict {
$(
$(#[$variant_meta])*
$variant
$( { $( $(#[$field_meta])* $field: $field_type, )+ } )?,
)+
}
crate::census::declare_census! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ReductionCensus {
count: u32,
seat: ReductionCensusSeat,
context {}
fields {
$( $variant => $seat, )+
}
}
}
};
}
with_shrink_verdicts!(declare_reduction_census);
#[path = "type_guard.rs"]
mod guard;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ReductionHalt {
FixedPointReached,
BudgetExhausted,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ReductionOutcome {
input: Vec<u8>,
fingerprint: Fingerprint,
census: ReductionCensus,
halt: ReductionHalt,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ReductionEvidence {
standing: TrialRunStanding,
generation: GenerationProfile,
schema: GeneratedSupportSchemaId,
probe_revision: RevisionBinding,
minimization: MinimizationProfile,
semantic_reducers: Vec<SemanticReducerExecution>,
byte_reducer: ByteReducerExecution,
outcome: ReductionOutcome,
replay: ReplayPosture,
}
#[must_use = "a refusal is the reason a reduction did not run"]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReductionRefusal {
BaselineDidNotFail,
BaselineFingerprintDiffers {
found: Fingerprint,
},
SemanticReducerRefused {
reducer: SemanticReducerId,
cause: SemanticCandidateRefusal,
},
}