use serde::{Deserialize, Serialize};
#[repr(u8)]
#[derive(
Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
)]
pub enum Priority {
Critical = 1,
High = 2,
#[default]
Normal = 3,
Low = 4,
Minimal = 5,
}
impl Priority {
#[must_use]
pub fn from_u8(value: u8) -> Option<Self> {
match value {
1 => Some(Self::Critical),
2 => Some(Self::High),
3 => Some(Self::Normal),
4 => Some(Self::Low),
5 => Some(Self::Minimal),
_ => None,
}
}
#[must_use]
pub fn as_u8(self) -> u8 {
self as u8
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod tests {
use super::*;
#[test]
fn default_is_normal() {
assert_eq!(Priority::default(), Priority::Normal);
assert_eq!(Priority::default().as_u8(), 3);
}
#[test]
fn round_trip() {
for v in 1..=5 {
let p = Priority::from_u8(v).unwrap();
assert_eq!(p.as_u8(), v);
}
}
#[test]
fn out_of_range() {
assert!(Priority::from_u8(0).is_none());
assert!(Priority::from_u8(6).is_none());
}
#[test]
fn ordering() {
assert!(Priority::Critical < Priority::High);
assert!(Priority::High < Priority::Normal);
assert!(Priority::Normal < Priority::Low);
assert!(Priority::Low < Priority::Minimal);
}
}