use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum PartitionHealingDecision {
Canonicalized,
Quarantined,
Rejected,
ManualInterventionRequired,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PartitionHealingReport {
pub partition_id: String,
pub healing_decision: PartitionHealingDecision,
pub healed_root: Option<[u8; 32]>,
}
impl PartitionHealingReport {
#[must_use]
pub fn is_valid(&self) -> bool {
if self.healing_decision == PartitionHealingDecision::Canonicalized {
self.healed_root.is_some()
} else {
self.healed_root.is_none()
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn healing_report_validates_canonicalization() {
let valid_report = PartitionHealingReport {
partition_id: "part-01".into(),
healing_decision: PartitionHealingDecision::Canonicalized,
healed_root: Some([1; 32]),
};
assert!(valid_report.is_valid());
let invalid_report = PartitionHealingReport {
partition_id: "part-02".into(),
healing_decision: PartitionHealingDecision::Canonicalized,
healed_root: None,
};
assert!(!invalid_report.is_valid());
}
#[test]
fn healing_report_validates_non_canonical() {
let valid_quarantine = PartitionHealingReport {
partition_id: "part-03".into(),
healing_decision: PartitionHealingDecision::Quarantined,
healed_root: None,
};
assert!(valid_quarantine.is_valid());
let invalid_quarantine = PartitionHealingReport {
partition_id: "part-04".into(),
healing_decision: PartitionHealingDecision::Quarantined,
healed_root: Some([2; 32]), };
assert!(!invalid_quarantine.is_valid());
}
}