use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum FaultInjectionEvaluation {
Applied {
rule_id: String,
},
ProbabilityMiss {
rule_id: String,
probability: f32,
},
Disabled {
rule_id: String,
},
BeforeStartTime {
rule_id: String,
},
AfterEndTime {
rule_id: String,
},
HitLimitExhausted {
rule_id: String,
hit_count: u32,
hit_limit: u32,
},
OperationMismatch {
rule_id: String,
},
RegionMismatch {
rule_id: String,
},
ContainerMismatch {
rule_id: String,
},
Superseded {
rule_id: String,
},
}
impl Eq for FaultInjectionEvaluation {}
impl FaultInjectionEvaluation {
pub fn rule_id(&self) -> &str {
match self {
Self::Applied { rule_id }
| Self::ProbabilityMiss { rule_id, .. }
| Self::Disabled { rule_id }
| Self::BeforeStartTime { rule_id }
| Self::AfterEndTime { rule_id }
| Self::HitLimitExhausted { rule_id, .. }
| Self::OperationMismatch { rule_id }
| Self::RegionMismatch { rule_id }
| Self::ContainerMismatch { rule_id }
| Self::Superseded { rule_id } => rule_id,
}
}
pub fn was_applied(&self) -> bool {
matches!(self, Self::Applied { .. })
}
}
impl std::fmt::Display for FaultInjectionEvaluation {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Applied { rule_id } => write!(f, "rule '{rule_id}': applied"),
Self::ProbabilityMiss {
rule_id,
probability,
} => {
write!(
f,
"rule '{rule_id}': skipped (probability miss, p={probability})"
)
}
Self::Disabled { rule_id } => write!(f, "rule '{rule_id}': skipped (disabled)"),
Self::BeforeStartTime { rule_id } => {
write!(f, "rule '{rule_id}': skipped (before start time)")
}
Self::AfterEndTime { rule_id } => {
write!(f, "rule '{rule_id}': skipped (after end time)")
}
Self::HitLimitExhausted {
rule_id,
hit_count,
hit_limit,
} => {
write!(
f,
"rule '{rule_id}': skipped (hit limit {hit_count}/{hit_limit})"
)
}
Self::OperationMismatch { rule_id } => {
write!(f, "rule '{rule_id}': skipped (operation mismatch)")
}
Self::RegionMismatch { rule_id } => {
write!(f, "rule '{rule_id}': skipped (region mismatch)")
}
Self::ContainerMismatch { rule_id } => {
write!(f, "rule '{rule_id}': skipped (container mismatch)")
}
Self::Superseded { rule_id } => {
write!(
f,
"rule '{rule_id}': skipped (superseded by higher priority)"
)
}
}
}
}