entrenar/quality/supply_chain/
severity.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
7pub enum Severity {
8 None,
10 Low,
12 Medium,
14 High,
16 Critical,
18}
19
20impl Severity {
21 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}