use crate::{errors::Error, format};
use std::fmt::Display;
#[derive(
serde_repr::Serialize_repr, serde_repr::Deserialize_repr, Debug, Copy, Clone, Eq, PartialEq,
)]
#[repr(u8)]
pub enum Priority {
None = 1,
Low = 2,
Medium = 3,
High = 4,
}
impl Display for Priority {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Priority::None => write!(f, "{}", format::normal_string("NONE (P4)")),
Priority::Low => write!(f, "{}", format::blue_string("LOW (P3)")),
Priority::Medium => write!(f, "{}", format::yellow_string("MEDIUM (P2)")),
Priority::High => write!(f, "{}", format::red_string("HIGH (P1)")),
}
}
}
impl Priority {
pub fn to_integer(self) -> u8 {
match self {
Priority::None => 1,
Priority::Low => 2,
Priority::Medium => 3,
Priority::High => 4,
}
}
}
pub fn from_integer(priority: Option<u8>) -> Result<Option<Priority>, Error> {
match priority {
None => Ok(None),
Some(1) => Ok(Some(Priority::None)),
Some(2) => Ok(Some(Priority::Low)),
Some(3) => Ok(Some(Priority::Medium)),
Some(4) => Ok(Some(Priority::High)),
Some(num) => Err(Error::new("priority", &format!("Invalid priority: {num}"))),
}
}
pub fn all_priorities() -> Vec<Priority> {
vec![
Priority::None,
Priority::Low,
Priority::Medium,
Priority::High,
]
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
#[test]
fn test_all_priorities() {
let result = all_priorities();
let expected = vec![
Priority::None,
Priority::Low,
Priority::Medium,
Priority::High,
];
assert_eq!(result, expected);
}
#[test]
fn test_from_integer() {
let result = from_integer(Some(1)).unwrap();
let expected = Some(Priority::None);
assert_eq!(result, expected);
let result = from_integer(Some(4)).unwrap();
let expected = Some(Priority::High);
assert_eq!(result, expected);
assert_eq!(from_integer(Some(2)).unwrap(), Some(Priority::Low));
assert_eq!(from_integer(Some(3)).unwrap(), Some(Priority::Medium));
assert_eq!(from_integer(None).unwrap(), None);
let err = from_integer(Some(5)).unwrap_err();
assert_eq!(err.source, "priority");
assert_eq!(err.message, "Invalid priority: 5");
}
#[test]
fn test_to_integer() {
let result = Priority::None.to_integer();
let expected = 1;
assert_eq!(result, expected);
let result = Priority::High.to_integer();
let expected = 4;
assert_eq!(result, expected);
assert_eq!(Priority::Low.to_integer(), 2);
assert_eq!(Priority::Medium.to_integer(), 3);
}
#[test]
fn test_fmt() {
let result = Priority::None.to_string();
let expected = String::from("NONE (P4)");
assert_eq!(result, expected);
let result = Priority::High.to_string();
let expected = String::from("HIGH (P1)");
assert_eq!(result, expected);
assert_eq!(Priority::Low.to_string(), "LOW (P3)");
assert_eq!(Priority::Medium.to_string(), "MEDIUM (P2)");
}
}