Skip to main content

over_there/utils/
either.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
4pub enum Either<T, U> {
5    Left(T),
6    Right(U),
7}
8
9impl<T, U> Either<T, U> {
10    pub fn is_left(&self) -> bool {
11        self.get_left().is_some()
12    }
13
14    pub fn is_right(&self) -> bool {
15        self.get_right().is_some()
16    }
17
18    pub fn get_left(&self) -> Option<&T> {
19        match self {
20            Self::Left(x) => Some(x),
21            _ => None,
22        }
23    }
24
25    pub fn get_right(&self) -> Option<&U> {
26        match self {
27            Self::Right(x) => Some(x),
28            _ => None,
29        }
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::Either;
36
37    #[test]
38    fn is_left_yields_true_if_left() {
39        let e = Either::Left::<u32, &str>(123);
40        assert_eq!(e.is_left(), true);
41    }
42
43    #[test]
44    fn is_left_yields_false_if_right() {
45        let e = Either::Right::<u32, &str>("123");
46        assert_eq!(e.is_left(), false);
47    }
48
49    #[test]
50    fn is_right_yields_true_if_right() {
51        let e = Either::Right::<u32, &str>("123");
52        assert_eq!(e.is_right(), true);
53    }
54
55    #[test]
56    fn is_right_yields_false_if_left() {
57        let e = Either::Left::<u32, &str>(123);
58        assert_eq!(e.is_right(), false);
59    }
60
61    #[test]
62    fn get_left_yields_some_value_if_left() {
63        let e = Either::Left::<u32, &str>(123);
64        assert_eq!(e.get_left(), Some(&123));
65    }
66
67    #[test]
68    fn get_left_yields_none_if_right() {
69        let e = Either::Right::<u32, &str>("123");
70        assert_eq!(e.get_left(), None);
71    }
72
73    #[test]
74    fn get_right_yields_some_value_if_right() {
75        let e = Either::Right::<u32, &str>("123");
76        assert_eq!(e.get_right(), Some(&"123"));
77    }
78
79    #[test]
80    fn get_right_yields_none_if_left() {
81        let e = Either::Left::<u32, &str>(123);
82        assert_eq!(e.get_right(), None);
83    }
84}