Skip to main content

hfx_core/
level.rs

1//! Dataset-local drainage-unit level type.
2
3/// Errors from constructing [`Level`].
4#[derive(Debug, thiserror::Error)]
5pub enum LevelError {
6    /// Returned when a level is negative.
7    #[error("level must be non-negative, got {value}")]
8    Negative {
9        /// The invalid raw value.
10        value: i16,
11    },
12}
13
14/// Dataset-local drainage-unit resolution tier.
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
16pub struct Level(i16);
17
18impl Level {
19    /// Construct a [`Level`] from a raw `i16`.
20    ///
21    /// # Errors
22    ///
23    /// | Condition | Error variant |
24    /// |-----------|---------------|
25    /// | `raw < 0` | [`LevelError::Negative`] |
26    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    /// Return the underlying `i16` value.
34    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}