From a2e5c3d5d3bc9253fb634bf8b1b30ec7087e886f Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 3 Oct 2024 00:30:16 +0000 Subject: [PATCH] add FlatOk trait to Result/Option suite Signed-off-by: Jason Volk --- src/core/result.rs | 3 ++- src/core/result/flat_ok.rs | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/core/result/flat_ok.rs 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 { + /// Equivalent to .transpose().ok().flatten() + fn flat_ok(self) -> Option; + + /// Equivalent to .transpose().ok().flatten().ok_or(...) + fn flat_ok_or(self, err: E) -> Result; + + /// Equivalent to .transpose().ok().flatten().ok_or_else(...) + fn flat_ok_or_else E>(self, err: F) -> Result; +} + +impl FlatOk for Option> { + #[inline] + fn flat_ok(self) -> Option { self.transpose().ok().flatten() } + + #[inline] + fn flat_ok_or(self, err: Ep) -> Result { self.flat_ok().ok_or(err) } + + #[inline] + fn flat_ok_or_else Ep>(self, err: F) -> Result { self.flat_ok().ok_or_else(err) } +} + +impl FlatOk for Result, E> { + #[inline] + fn flat_ok(self) -> Option { self.ok().flatten() } + + #[inline] + fn flat_ok_or(self, err: Ep) -> Result { self.flat_ok().ok_or(err) } + + #[inline] + fn flat_ok_or_else Ep>(self, err: F) -> Result { self.flat_ok().ok_or_else(err) } +}