rs_std_ext/
result.rs

1//! Extension for [`std::result::Result`].
2
3/// Extension methods for [`std::result::Result`].
4pub trait ResultExt<T, E> {
5    /// Tap into a `Result` and modify its `Ok` value.
6    /// 
7    /// This method captures the `Result` in order not to break the caller-chain.
8    /// 
9    /// ## Example
10    /// 
11    /// ```rust
12    /// use rs_std_ext::result::ResultExt;
13    /// 
14    /// let mut x: Result<String, usize> = Ok("4".into());
15    /// assert_eq!(x.tap_mut(|s| s.push('2')), Ok("42".into()));
16    /// ```
17    fn tap_mut(self, f: impl FnOnce(&mut T)) -> Result<T, E>;
18
19    /// Tap into a `Result` and modify its `Err` value.
20    /// 
21    /// This method captures the `Result` in order not to break the caller-chain.
22    /// 
23    /// ## Example
24    /// 
25    /// ```rust
26    /// use rs_std_ext::result::ResultExt;
27    /// 
28    /// let mut x: Result<String, usize> = Err(40);
29    /// assert_eq!(x.tap_err_mut(|s| *s += 2), Err(42));
30    /// ```
31    fn tap_err_mut(self, f: impl FnOnce(&mut E)) -> Result<T, E>;
32
33    /// Swap the `Ok` and `Err` values of a `Result`.
34    /// 
35    /// ## Example
36    /// 
37    /// ```rust
38    /// use rs_std_ext::result::ResultExt;
39    /// 
40    /// let x: Result<&str, usize> = Ok("foo");
41    /// assert_eq!(x.swap(), Err("foo"));
42    /// ```
43    fn swap(self) -> Result<E, T>;
44}
45
46impl<T, E> ResultExt<T, E> for Result<T, E> {
47    fn tap_mut(mut self, f: impl FnOnce(&mut T)) -> Result<T, E> {
48        if let Ok(val) = &mut self {
49            f(val)
50        }
51
52        self
53    }
54
55    fn tap_err_mut(mut self, f: impl FnOnce(&mut E)) -> Result<T, E> {
56        if let Err(e) = &mut self {
57            f(e)
58        }
59
60        self
61    }
62
63    fn swap(self) -> Result<E, T> {
64        match self {
65            Ok(t) => Err(t),
66            Err(e) => Ok(e),
67        }
68    }
69}