diff options
| -rw-r--r-- | src/exun.rs | 3 | ||||
| -rw-r--r-- | src/lib.rs | 2 | ||||
| -rw-r--r-- | 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<E: Error, U> From<E> for Exun<E, U> { } } -#[cfg(feature = "alloc")] impl<E> From<RawUnexpected> for Exun<E, RawUnexpected> { fn from(ue: RawUnexpected) -> Self { Unexpected(ue) } } -#[cfg(feature = "alloc")] impl<E> From<RawUnexpected> for Exun<E, UnexpectedError> { fn from(ue: RawUnexpected) -> Self { Unexpected(ue.into()) @@ -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<T, E: Errorable + 'static> ResultMsgExt<T> for Result<T, E> { } } +/// Provides [`Result::unexpect_none`] and [`Option::unexpect_none`] +/// +/// [`Result::unexpect_none`]: `ResultNoneExt::unexpect_none` +/// [`Option::unexpect_none`]: `ResultNoneExt::unexpect_none` +pub trait ResultNoneExt<T>: Sealed { + /// Converts [`Result<T, E>`] or [`Option<T>`] to + /// [`Result<T, RawUnexpected>`]. + /// + /// # Examples + /// + /// ``` + /// use exun::*; + /// use core::fmt::Error; + /// + /// let res: Result<i32, Error> = Err(Error); + /// let res: Result<i32, RawUnexpected> = res.unexpect_none(); + /// ``` + /// + /// Use with the try operator + /// + /// ``` + /// use exun::*; + /// use core::fmt::Error; + /// + /// fn foo() -> Result<i32, UnexpectedError> { + /// let res: Result<i32, Error> = Err(Error); + /// Ok(res.unexpect_none()?) + /// } + /// ``` + /// + /// Use with the try operator and [`Exun`] + /// + /// ``` + /// use exun::*; + /// use core::fmt::Error; + /// + /// fn foo() -> Result<i32, Exun<(), UnexpectedError>> { + /// let res: Result<i32, Error> = Err(Error); + /// Ok(res.unexpect_none()?) + /// } + /// ``` + /// + /// Use with [`Option`] + /// + /// ``` + /// use exun::*; + /// + /// fn foo() -> Result<i32, UnexpectedError> { + /// let option: Option<i32> = None; + /// Ok(option.unexpect_none()?) + /// } + /// ``` + /// + /// [`Exun`]: `crate::Exun` + #[allow(clippy::missing_errors_doc)] + fn unexpect_none(self) -> Result<T, RawUnexpected>; +} + +impl<T, E> ResultNoneExt<T> for Result<T, E> { + fn unexpect_none(self) -> Result<T, RawUnexpected> { + self.map_or_else(|_| Err(RawUnexpected::none()), |val| Ok(val)) + } +} + +impl<T> ResultNoneExt<T> for Option<T> { + fn unexpect_none(self) -> Result<T, RawUnexpected> { + self.ok_or_else(RawUnexpected::none) + } +} + pub trait ResultExunExt<T, E, U>: Sealed { /// Converts [`Result<T, Exun<E, U>>`] to [`Option<E>`]. /// |
