Skip to main content

entrenar/quality/supply_chain/
severity.rs

1//! Severity levels for security advisories.
2
3use serde::{Deserialize, Serialize};
4
5/// Severity level for security advisories
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
7pub enum Severity {
8    /// Informational only
9    None,
10    /// Low severity
11    Low,
12    /// Medium severity
13    Medium,
14    /// High severity
15    High,
16    /// Critical severity
17    Critical,
18}
19
20impl Severity {
21    /// Parse severity from string (infallible, returns None for unknown)
22    pub fn parse(s: &str) -> Self {
23        match s.to_lowercase().as_str() {
24            "critical" => Self::Critical,
25            "high" => Self::High,
26            "medium" => Self::Medium,
27            "low" => Self::Low,
28            _ => Self::None,
29        }
30    }
31}
32
33impl std::fmt::Display for Severity {
34    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35        match self {
36            Self::None => write!(f, "none"),
37            Self::Low => write!(f, "low"),
38            Self::Medium => write!(f, "medium"),
39            Self::High => write!(f, "high"),
40            Self::Critical => write!(f, "critical"),
41        }
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn test_severity_parse_critical() {
51        assert_eq!(Severity::parse("critical"), Severity::Critical);
52        assert_eq!(Severity::parse("CRITICAL"), Severity::Critical);
53        assert_eq!(Severity::parse("Critical"), Severity::Critical);
54    }
55
56    #[test]
57    fn test_severity_parse_high() {
58        assert_eq!(Severity::parse("high"), Severity::High);
59        assert_eq!(Severity::parse("HIGH"), Severity::High);
60    }
61
62    #[test]
63    fn test_severity_parse_medium() {
64        assert_eq!(Severity::parse("medium"), Severity::Medium);
65        assert_eq!(Severity::parse("MEDIUM"), Severity::Medium);
66    }
67
68    #[test]
69    fn test_severity_parse_low() {
70        assert_eq!(Severity::parse("low"), Severity::Low);
71        assert_eq!(Severity::parse("LOW"), Severity::Low);
72    }
73
74    #[test]
75    fn test_severity_parse_unknown() {
76        assert_eq!(Severity::parse("unknown"), Severity::None);
77        assert_eq!(Severity::parse(""), Severity::None);
78        assert_eq!(Severity::parse("info"), Severity::None);
79    }
80
81    #[test]
82    fn test_severity_display() {
83        assert_eq!(Severity::None.to_string(), "none");
84        assert_eq!(Severity::Low.to_string(), "low");
85        assert_eq!(Severity::Medium.to_string(), "medium");
86        assert_eq!(Severity::High.to_string(), "high");
87        assert_eq!(Severity::Critical.to_string(), "critical");
88    }
89
90    #[test]
91    fn test_severity_ord() {
92        assert!(Severity::None < Severity::Low);
93        assert!(Severity::Low < Severity::Medium);
94        assert!(Severity::Medium < Severity::High);
95        assert!(Severity::High < Severity::Critical);
96    }
97
98    #[test]
99    fn test_severity_eq() {
100        assert_eq!(Severity::Critical, Severity::Critical);
101        assert_ne!(Severity::Critical, Severity::High);
102    }
103
104    #[test]
105    fn test_severity_hash() {
106        use std::collections::HashSet;
107        let mut set = HashSet::new();
108        set.insert(Severity::Critical);
109        set.insert(Severity::Critical);
110        assert_eq!(set.len(), 1);
111        set.insert(Severity::High);
112        assert_eq!(set.len(), 2);
113    }
114
115    #[test]
116    fn test_severity_serde() {
117        let sev = Severity::High;
118        let json = serde_json::to_string(&sev).expect("JSON serialization should succeed");
119        let deserialized: Severity =
120            serde_json::from_str(&json).expect("JSON deserialization should succeed");
121        assert_eq!(sev, deserialized);
122    }
123
124    #[test]
125    fn test_severity_clone() {
126        let sev = Severity::Critical;
127        let cloned = sev;
128        assert_eq!(sev, cloned);
129    }
130
131    #[test]
132    fn test_severity_debug() {
133        assert_eq!(format!("{:?}", Severity::Critical), "Critical");
134        assert_eq!(format!("{:?}", Severity::None), "None");
135    }
136}