use parlov_core::DifferentialSet;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ControlDecision {
Reached(f64),
Blocked,
}
impl ControlDecision {
#[must_use]
pub fn confidence(self) -> f64 {
match self {
Self::Reached(c) => c,
Self::Blocked => 0.0,
}
}
}
#[must_use]
pub fn control_integrity(differential: &DifferentialSet) -> ControlDecision {
let Some(canonical) = differential.canonical.as_ref() else {
return ControlDecision::Reached(1.0);
};
let Some(mutated) = differential.baseline.first() else {
return ControlDecision::Reached(1.0);
};
let canonical_status = canonical.response.status.as_u16();
if matches!(canonical_status, 301 | 308) {
return ControlDecision::Blocked;
}
let canonical_ok = canonical.response.status.is_success();
let mutated_ok = mutated.response.status.is_success();
if canonical_ok && !mutated_ok {
return ControlDecision::Blocked;
}
ControlDecision::Reached(1.0)
}
#[cfg(test)]
#[path = "control_tests.rs"]
mod tests;