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}