#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum BudgetLevel {
Ok,
Prep,
Compact,
Stop,
Emergency,
}
impl BudgetLevel {
pub fn classify(used_pct: u8) -> Self {
match used_pct {
p if p >= 90 => Self::Emergency,
p if p >= 80 => Self::Stop,
p if p >= 50 => Self::Compact,
p if p >= 30 => Self::Prep,
_ => Self::Ok,
}
}
pub fn label(&self) -> &'static str {
match self {
Self::Ok => "OK",
Self::Prep => "PREP",
Self::Compact => "COMPACT",
Self::Stop => "STOP",
Self::Emergency => "EMERGENCY",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn classifies_every_band_boundary_per_canon() {
assert_eq!(BudgetLevel::classify(0), BudgetLevel::Ok);
assert_eq!(BudgetLevel::classify(29), BudgetLevel::Ok);
assert_eq!(BudgetLevel::classify(30), BudgetLevel::Prep);
assert_eq!(BudgetLevel::classify(49), BudgetLevel::Prep);
assert_eq!(BudgetLevel::classify(50), BudgetLevel::Compact);
assert_eq!(BudgetLevel::classify(79), BudgetLevel::Compact);
assert_eq!(BudgetLevel::classify(80), BudgetLevel::Stop);
assert_eq!(BudgetLevel::classify(89), BudgetLevel::Stop);
assert_eq!(BudgetLevel::classify(90), BudgetLevel::Emergency);
assert_eq!(BudgetLevel::classify(100), BudgetLevel::Emergency);
}
#[test]
fn severity_orders_ascending() {
assert!(BudgetLevel::Ok < BudgetLevel::Prep);
assert!(BudgetLevel::Prep < BudgetLevel::Compact);
assert!(BudgetLevel::Compact < BudgetLevel::Stop);
assert!(BudgetLevel::Stop < BudgetLevel::Emergency);
}
}