pair_utils/
side.rs

1#[derive(Copy, Clone, Debug, PartialEq, Eq)]
2pub enum Side {
3    L = 0,
4    R = 1,
5}
6
7impl Side {
8    pub fn swap(self) -> Self {
9        match self {
10            Self::L => Self::R,
11            Self::R => Self::L,
12        }
13    }
14}
15
16impl From<usize> for Side {
17    fn from(i: usize) -> Self {
18        match i {
19            0 => Self::L,
20            1 => Self::R,
21            _ => panic!("Cannot convert `{}` into `Side`. Should be `0` or `1`", i),
22        }
23    }
24}
25
26impl From<Side> for usize {
27    fn from(value: Side) -> Self {
28        match value {
29            Side::L => 0,
30            Side::R => 1,
31        }
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38    use std::panic;
39
40    #[test]
41    fn swap() {
42        assert_eq!(Side::L.swap(), Side::R);
43        assert_eq!(Side::R.swap(), Side::L);
44    }
45
46    #[test]
47    fn as_usize() {
48        assert_eq!(Side::L as usize, 0usize);
49        assert_eq!(Side::R as usize, 1usize);
50    }
51
52    #[test]
53    fn from_into_usize() {
54        assert_eq!(Side::from(0), Side::L);
55        assert_eq!(Side::from(1), Side::R);
56
57        let hook = panic::take_hook();
58        panic::set_hook(Box::new(|_| {}));
59        assert!(panic::catch_unwind(|| Side::from(2)).is_err());
60        panic::set_hook(hook);
61
62        let left: usize = Side::L.into();
63        assert_eq!(left, 0);
64
65        let right: usize = Side::R.into();
66        assert_eq!(right, 1);
67    }
68}