over_there/utils/
either.rs1use 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}