diff --git a/src/core/result.rs b/src/core/result.rs index 82d67a9c..9a60d19e 100644 --- a/src/core/result.rs +++ b/src/core/result.rs @@ -1,4 +1,5 @@ mod debug_inspect; +mod flat_ok; mod into_is_ok; mod log_debug_err; mod log_err; @@ -7,7 +8,7 @@ mod not_found; mod unwrap_infallible; pub use self::{ - debug_inspect::DebugInspect, into_is_ok::IntoIsOk, log_debug_err::LogDebugErr, log_err::LogErr, + debug_inspect::DebugInspect, flat_ok::FlatOk, into_is_ok::IntoIsOk, log_debug_err::LogDebugErr, log_err::LogErr, map_expect::MapExpect, not_found::NotFound, unwrap_infallible::UnwrapInfallible, }; diff --git a/src/core/result/flat_ok.rs b/src/core/result/flat_ok.rs new file mode 100644 index 00000000..e378e5d0 --- /dev/null +++ b/src/core/result/flat_ok.rs @@ -0,0 +1,34 @@ +use super::Result; + +pub trait FlatOk<T> { + /// Equivalent to .transpose().ok().flatten() + fn flat_ok(self) -> Option<T>; + + /// Equivalent to .transpose().ok().flatten().ok_or(...) + fn flat_ok_or<E>(self, err: E) -> Result<T, E>; + + /// Equivalent to .transpose().ok().flatten().ok_or_else(...) + fn flat_ok_or_else<E, F: FnOnce() -> E>(self, err: F) -> Result<T, E>; +} + +impl<T, E> FlatOk<T> for Option<Result<T, E>> { + #[inline] + fn flat_ok(self) -> Option<T> { self.transpose().ok().flatten() } + + #[inline] + fn flat_ok_or<Ep>(self, err: Ep) -> Result<T, Ep> { self.flat_ok().ok_or(err) } + + #[inline] + fn flat_ok_or_else<Ep, F: FnOnce() -> Ep>(self, err: F) -> Result<T, Ep> { self.flat_ok().ok_or_else(err) } +} + +impl<T, E> FlatOk<T> for Result<Option<T>, E> { + #[inline] + fn flat_ok(self) -> Option<T> { self.ok().flatten() } + + #[inline] + fn flat_ok_or<Ep>(self, err: Ep) -> Result<T, Ep> { self.flat_ok().ok_or(err) } + + #[inline] + fn flat_ok_or_else<Ep, F: FnOnce() -> Ep>(self, err: F) -> Result<T, Ep> { self.flat_ok().ok_or_else(err) } +}