From e187b45c780217faa64bce567ecf5ba20371117c Mon Sep 17 00:00:00 2001 From: Botahamec Date: Wed, 9 Aug 2023 10:20:38 -0400 Subject: Add ResultNoneExt --- src/result.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) (limited to 'src/result.rs') diff --git a/src/result.rs b/src/result.rs index 0bef098..f31df2b 100644 --- a/src/result.rs +++ b/src/result.rs @@ -133,6 +133,76 @@ impl ResultMsgExt for Result { } } +/// Provides [`Result::unexpect_none`] and [`Option::unexpect_none`] +/// +/// [`Result::unexpect_none`]: `ResultNoneExt::unexpect_none` +/// [`Option::unexpect_none`]: `ResultNoneExt::unexpect_none` +pub trait ResultNoneExt: Sealed { + /// Converts [`Result`] or [`Option`] to + /// [`Result`]. + /// + /// # Examples + /// + /// ``` + /// use exun::*; + /// use core::fmt::Error; + /// + /// let res: Result = Err(Error); + /// let res: Result = res.unexpect_none(); + /// ``` + /// + /// Use with the try operator + /// + /// ``` + /// use exun::*; + /// use core::fmt::Error; + /// + /// fn foo() -> Result { + /// let res: Result = Err(Error); + /// Ok(res.unexpect_none()?) + /// } + /// ``` + /// + /// Use with the try operator and [`Exun`] + /// + /// ``` + /// use exun::*; + /// use core::fmt::Error; + /// + /// fn foo() -> Result> { + /// let res: Result = Err(Error); + /// Ok(res.unexpect_none()?) + /// } + /// ``` + /// + /// Use with [`Option`] + /// + /// ``` + /// use exun::*; + /// + /// fn foo() -> Result { + /// let option: Option = None; + /// Ok(option.unexpect_none()?) + /// } + /// ``` + /// + /// [`Exun`]: `crate::Exun` + #[allow(clippy::missing_errors_doc)] + fn unexpect_none(self) -> Result; +} + +impl ResultNoneExt for Result { + fn unexpect_none(self) -> Result { + self.map_or_else(|_| Err(RawUnexpected::none()), |val| Ok(val)) + } +} + +impl ResultNoneExt for Option { + fn unexpect_none(self) -> Result { + self.ok_or_else(RawUnexpected::none) + } +} + pub trait ResultExunExt: Sealed { /// Converts [`Result>`] to [`Option`]. /// -- cgit v1.2.3