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}