#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum PressureLevel {
Normal,
Warning,
Critical,
Emergency,
}
#[derive(Debug, Clone, Copy)]
pub struct PressureThresholds {
pub warning: u8,
pub critical: u8,
pub emergency: u8,
}
impl Default for PressureThresholds {
fn default() -> Self {
Self {
warning: 70,
critical: 85,
emergency: 95,
}
}
}
impl PressureThresholds {
pub fn level_for(&self, utilization_percent: u8) -> PressureLevel {
if utilization_percent >= self.emergency {
PressureLevel::Emergency
} else if utilization_percent >= self.critical {
PressureLevel::Critical
} else if utilization_percent >= self.warning {
PressureLevel::Warning
} else {
PressureLevel::Normal
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_thresholds() {
let t = PressureThresholds::default();
assert_eq!(t.level_for(0), PressureLevel::Normal);
assert_eq!(t.level_for(69), PressureLevel::Normal);
assert_eq!(t.level_for(70), PressureLevel::Warning);
assert_eq!(t.level_for(84), PressureLevel::Warning);
assert_eq!(t.level_for(85), PressureLevel::Critical);
assert_eq!(t.level_for(94), PressureLevel::Critical);
assert_eq!(t.level_for(95), PressureLevel::Emergency);
assert_eq!(t.level_for(100), PressureLevel::Emergency);
}
#[test]
fn pressure_ordering() {
assert!(PressureLevel::Normal < PressureLevel::Warning);
assert!(PressureLevel::Warning < PressureLevel::Critical);
assert!(PressureLevel::Critical < PressureLevel::Emergency);
}
}