From e187b45c780217faa64bce567ecf5ba20371117c Mon Sep 17 00:00:00 2001 From: Botahamec Date: Wed, 9 Aug 2023 10:20:38 -0400 Subject: Add ResultNoneExt --- src/exun.rs | 3 --- src/lib.rs | 2 +- src/result.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 4 deletions(-) diff --git a/src/exun.rs b/src/exun.rs index 87e8610..0dcd936 100644 --- a/src/exun.rs +++ b/src/exun.rs @@ -3,7 +3,6 @@ use core::fmt::{self, Debug, Display}; #[cfg(feature = "std")] use std::error::Error; -#[cfg(feature = "alloc")] use crate::{RawUnexpected, UnexpectedError}; pub use Exun::{Expected, Unexpected}; @@ -56,14 +55,12 @@ impl From for Exun { } } -#[cfg(feature = "alloc")] impl From for Exun { fn from(ue: RawUnexpected) -> Self { Unexpected(ue) } } -#[cfg(feature = "alloc")] impl From for Exun { fn from(ue: RawUnexpected) -> Self { Unexpected(ue.into()) diff --git a/src/lib.rs b/src/lib.rs index 742cc60..8412e2a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -156,7 +156,7 @@ pub use result::ResultErrorExt; pub use result::ResultMsgExt; pub use crate::exun::Exun; -pub use result::ResultExunExt; +pub use result::{ResultExunExt, ResultNoneExt}; pub use unexpected::{RawUnexpected, UnexpectedError}; pub use Exun::{Expected, Unexpected}; 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