1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub struct Dimension(usize);
7
8impl Dimension {
9 pub const ONE: Self = Self(1);
11 pub const TWO: Self = Self(2);
13 pub const THREE: Self = Self(3);
15
16 #[must_use]
18 pub const fn new(value: usize) -> Option<Self> {
19 if value == 0 { None } else { Some(Self(value)) }
20 }
21
22 #[must_use]
24 pub const fn new_unchecked(value: usize) -> Self {
25 Self(value)
26 }
27
28 #[must_use]
30 pub const fn value(self) -> usize {
31 self.0
32 }
33
34 #[must_use]
36 pub const fn is_spatial(self) -> bool {
37 self.0 <= 3
38 }
39}
40
41#[cfg(test)]
42mod tests {
43 use super::Dimension;
44
45 #[test]
46 fn validates_positive_dimensions() {
47 assert_eq!(Dimension::new(0), None);
48 assert_eq!(Dimension::new(2), Some(Dimension::TWO));
49 assert_eq!(Dimension::THREE.value(), 3);
50 assert!(Dimension::THREE.is_spatial());
51 assert!(!Dimension::new_unchecked(4).is_spatial());
52 }
53}