1#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
14pub enum PressureLevel {
15 Normal,
17 Warning,
20 Critical,
23 Emergency,
26}
27
28#[derive(Debug, Clone, Copy)]
30pub struct PressureThresholds {
31 pub warning: u8,
33 pub critical: u8,
35 pub emergency: u8,
37}
38
39impl Default for PressureThresholds {
40 fn default() -> Self {
41 Self {
42 warning: 70,
43 critical: 85,
44 emergency: 95,
45 }
46 }
47}
48
49impl PressureThresholds {
50 pub fn level_for(&self, utilization_percent: u8) -> PressureLevel {
52 if utilization_percent >= self.emergency {
53 PressureLevel::Emergency
54 } else if utilization_percent >= self.critical {
55 PressureLevel::Critical
56 } else if utilization_percent >= self.warning {
57 PressureLevel::Warning
58 } else {
59 PressureLevel::Normal
60 }
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67
68 #[test]
69 fn default_thresholds() {
70 let t = PressureThresholds::default();
71 assert_eq!(t.level_for(0), PressureLevel::Normal);
72 assert_eq!(t.level_for(69), PressureLevel::Normal);
73 assert_eq!(t.level_for(70), PressureLevel::Warning);
74 assert_eq!(t.level_for(84), PressureLevel::Warning);
75 assert_eq!(t.level_for(85), PressureLevel::Critical);
76 assert_eq!(t.level_for(94), PressureLevel::Critical);
77 assert_eq!(t.level_for(95), PressureLevel::Emergency);
78 assert_eq!(t.level_for(100), PressureLevel::Emergency);
79 }
80
81 #[test]
82 fn pressure_ordering() {
83 assert!(PressureLevel::Normal < PressureLevel::Warning);
84 assert!(PressureLevel::Warning < PressureLevel::Critical);
85 assert!(PressureLevel::Critical < PressureLevel::Emergency);
86 }
87}