use crate::{Error, ErrorKind};
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Level(u8);
impl Level {
pub const NONE: Level = Level(0);
pub const FAST: Level = Level(1);
pub const DEFAULT: Level = Level(6);
pub const BEST: Level = Level(9);
pub const fn new(n: u8) -> Result<Level, Error> {
if n <= 9 {
Ok(Level(n))
} else {
Err(Error::config(ErrorKind::InvalidLevel))
}
}
#[must_use]
pub const fn get(self) -> u8 {
self.0
}
}
impl Default for Level {
fn default() -> Self {
Self::DEFAULT
}
}
impl TryFrom<u8> for Level {
type Error = Error;
fn try_from(n: u8) -> Result<Self, Error> {
Level::new(n)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_level_every_value_zero_to_nine_valid() {
for n in 0..=9 {
assert_eq!(Level::new(n).map(Level::get), Ok(n));
}
}
#[test]
fn test_level_ten_and_above_invalid() {
for n in 10..=255u8 {
assert_eq!(
Level::new(n).map_err(|e| e.kind()),
Err(ErrorKind::InvalidLevel)
);
assert!(Level::try_from(n).is_err());
}
}
#[test]
fn test_level_constants_and_default() {
assert_eq!(Level::NONE.get(), 0);
assert_eq!(Level::FAST.get(), 1);
assert_eq!(Level::default(), Level::DEFAULT);
assert!(Level::FAST < Level::BEST);
}
}