1#![doc = include_str!("../README.md")]
2
3pub trait ErrOr {
23 type Err;
24 fn err_or<OK>(self, ok: OK) -> Result<OK, Self::Err>;
25}
26impl<T> ErrOr for Option<T> {
27 type Err = T;
28 fn err_or<OK>(self, ok: OK) -> Result<OK, Self::Err> {
29 match self {
30 Some(err) => Err(err),
31 None => Ok(ok),
32 }
33 }
34}
35
36#[cfg(test)]
37mod err_to_tests {
38 use super::ErrOr;
39
40 #[test]
41 fn test_some_err_some() {
42 let some: Option<&str> = Some("Error");
43 let result = some.err_or(42);
44 assert_eq!(result, Err("Error"));
45 }
46
47 #[test]
48 fn test_some_err_none() {
49 let none: Option<&str> = None;
50 let result = none.err_or(42);
51 assert_eq!(result, Ok(42));
52 }
53
54 #[test]
55 fn test_some_err_some_different_type() {
56 let some: Option<i32> = Some(123);
57 let result = some.err_or("Success");
58 assert_eq!(result, Err(123));
59 }
60
61 #[test]
62 fn test_some_err_none_different_type() {
63 let none: Option<i32> = None;
64 let result = none.err_or("Success");
65 assert_eq!(result, Ok("Success"));
66 }
67}
68
69pub trait ErrOrElse {
92 type Err;
93 fn err_or_else<OK>(self, ok: impl FnOnce() -> OK) -> Result<OK, Self::Err>;
94}
95impl<T> ErrOrElse for Option<T> {
96 type Err = T;
97 fn err_or_else<OK>(self, ok: impl FnOnce() -> OK) -> Result<OK, Self::Err> {
98 match self {
99 Some(err) => Err(err),
100 None => Ok(ok()),
101 }
102 }
103}
104
105#[cfg(test)]
106mod some_to_err_else_tests {
107 use super::ErrOrElse;
108
109 #[test]
110 fn test_some_to_err_with_some() {
111 let input = Some("Error");
112 let result = input.err_or_else(|| "OK");
113 assert_eq!(result, Err("Error"));
114 }
115
116 #[test]
117 fn test_some_to_err_with_none() {
118 let input: Option<&str> = None;
119 let result = input.err_or_else(|| "OK");
120 assert_eq!(result, Ok("OK"));
121 }
122
123 #[test]
124 fn test_some_to_err_with_some_and_closure() {
125 let input = Some(2);
126 let result = input.err_or_else(|| 3 * 3);
127 assert_eq!(result, Err(2));
128 }
129
130 #[test]
131 fn test_some_to_err_with_none_and_closure() {
132 let input: Option<i32> = None;
133 let result = input.err_or_else(|| 3 * 3);
134 assert_eq!(result, Ok(9));
135 }
136}