#[derive(Debug, thiserror::Error)]
pub enum LevelError {
#[error("level must be non-negative, got {value}")]
Negative {
value: i16,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct Level(i16);
impl Level {
pub fn new(raw: i16) -> Result<Self, LevelError> {
if raw < 0 {
return Err(LevelError::Negative { value: raw });
}
Ok(Self(raw))
}
pub fn get(self) -> i16 {
self.0
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn accepts_zero() {
let level = Level::new(0).unwrap();
assert_eq!(level.get(), 0);
}
#[test]
fn accepts_positive() {
let level = Level::new(7).unwrap();
assert_eq!(level.get(), 7);
}
#[test]
fn rejects_negative() {
assert!(matches!(
Level::new(-1),
Err(LevelError::Negative { value: -1 })
));
}
}