some_to_err/
lib.rs

1#![doc = include_str!("../README.md")]
2
3/// The `SomeErr` trait provides a method for converting an `Option` into a `Result` by treating `Some` values as `Err` and `None` values as `Ok`.
4///
5/// # Examples
6///
7/// ```
8/// use some_to_err::ErrOr;
9///
10/// let some: Option<&str> = Some("Error");
11/// let result = some.err_or(42);
12/// assert_eq!(result, Err("Error"));
13/// ```
14///
15/// ```
16/// use some_to_err::ErrOr;
17///
18/// let none: Option<&str> = None;
19/// let result = none.err_or(42);
20/// assert_eq!(result, Ok(42));
21/// ```
22pub 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
69/// The `SomeToErrElse` trait provides a convenient method to convert an `Option<T>` into a `Result<OK, T>`
70/// by supplying a closure that generates the `OK` value for the `Result` when the input is `None`.
71///
72/// # Examples
73///
74/// Basic usage:
75///
76/// ```
77/// use some_to_err::ErrOrElse;
78///
79/// let input: Option<&str> = None;
80/// let result = input.err_or_else(|| "OK");
81/// assert_eq!(result, Ok("OK"));
82/// ```
83///
84/// ```
85/// use some_to_err::ErrOrElse;
86///
87/// let input = Some("Error");
88/// let result = input.err_or_else(|| "OK");
89/// assert_eq!(result, Err("Error"));
90/// ```
91pub 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}