#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum QualityLevel {
Q5,
Q4,
Q3,
Q2,
Q1,
}
impl QualityLevel {
#[must_use]
pub const fn numeric(self) -> u8 {
match self {
Self::Q1 => 1,
Self::Q2 => 2,
Self::Q3 => 3,
Self::Q4 => 4,
Self::Q5 => 5,
}
}
#[must_use]
pub const fn from_numeric(v: u8) -> Option<Self> {
match v {
1 => Some(Self::Q1),
2 => Some(Self::Q2),
3 => Some(Self::Q3),
4 => Some(Self::Q4),
5 => Some(Self::Q5),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn quality_level_numeric_round_trip() {
for q in [
QualityLevel::Q1,
QualityLevel::Q2,
QualityLevel::Q3,
QualityLevel::Q4,
QualityLevel::Q5,
] {
assert_eq!(QualityLevel::from_numeric(q.numeric()), Some(q));
}
}
#[test]
fn quality_level_ordering_q1_is_highest() {
assert!(QualityLevel::Q1.numeric() < QualityLevel::Q5.numeric());
}
#[test]
fn quality_level_from_numeric_rejects_out_of_range() {
assert_eq!(QualityLevel::from_numeric(0), None);
assert_eq!(QualityLevel::from_numeric(6), None);
}
}