1#[derive(Debug, thiserror::Error)]
5pub enum LevelError {
6 #[error("level must be non-negative, got {value}")]
8 Negative {
9 value: i16,
11 },
12}
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
16pub struct Level(i16);
17
18impl Level {
19 pub fn new(raw: i16) -> Result<Self, LevelError> {
27 if raw < 0 {
28 return Err(LevelError::Negative { value: raw });
29 }
30 Ok(Self(raw))
31 }
32
33 pub fn get(self) -> i16 {
35 self.0
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42
43 #[test]
44 fn accepts_zero() {
45 let level = Level::new(0).unwrap();
46 assert_eq!(level.get(), 0);
47 }
48
49 #[test]
50 fn accepts_positive() {
51 let level = Level::new(7).unwrap();
52 assert_eq!(level.get(), 7);
53 }
54
55 #[test]
56 fn rejects_negative() {
57 assert!(matches!(
58 Level::new(-1),
59 Err(LevelError::Negative { value: -1 })
60 ));
61 }
62}