#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "PascalCase"))]
pub enum RiskTier {
#[default]
Low,
Medium,
High,
Critical,
}
impl RiskTier {
pub fn from_proto_i32(v: i32) -> Option<Self> {
match v {
1 => Some(Self::Low),
2 => Some(Self::Medium),
3 => Some(Self::High),
4 => Some(Self::Critical),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ordering_reflects_severity() {
assert!(RiskTier::Low < RiskTier::Medium);
assert!(RiskTier::Medium < RiskTier::High);
assert!(RiskTier::High < RiskTier::Critical);
}
#[test]
fn default_is_low() {
assert_eq!(RiskTier::default(), RiskTier::Low);
}
#[test]
fn from_proto_i32_round_trips() {
assert_eq!(RiskTier::from_proto_i32(1), Some(RiskTier::Low));
assert_eq!(RiskTier::from_proto_i32(2), Some(RiskTier::Medium));
assert_eq!(RiskTier::from_proto_i32(3), Some(RiskTier::High));
assert_eq!(RiskTier::from_proto_i32(4), Some(RiskTier::Critical));
assert_eq!(RiskTier::from_proto_i32(0), None);
assert_eq!(RiskTier::from_proto_i32(99), None);
}
#[cfg(feature = "serde")]
#[test]
fn serde_round_trip() {
for tier in [RiskTier::Low, RiskTier::Medium, RiskTier::High, RiskTier::Critical] {
let json = serde_json::to_string(&tier).unwrap();
let back: RiskTier = serde_json::from_str(&json).unwrap();
assert_eq!(tier, back);
}
}
}