pub enum NullableResult<T, E> {
Ok(T),
Err(E),
Null,
}
Expand description
A replacement for Option<Result<T, E>>
or Result<Option<T>, E>
.
Sometimes, no value returned from an operation is not an error. It’s a special
case that needs to be handled, but it’s separate from error handling. Wrapping
an Option
in a Result
or vice versa can get very confusing very fast. Instead,
use a NullableResult
.
This is how it’s defined:
pub enum NullableResult<T, E> {
Ok(T),
Err(E),
Null,
}
§Convert to and From std Types
It defines the From
trait for Option<Result<T, E>>
and for
Result<Option<T>, E>
in both directions, so you can easily convert between the
standard library types and back.
let opt_res: Option<Result<usize, isize>> = Some(Ok(4));
let nr: NullableResult<usize, isize> = NullableResult::from(opt_res);
let opt_res: Option<Result<_,_>> = nr.into();
It also defines From
for [Option<T>] and for [
Result<T, E>`].
let nr: NullableResult<_, isize> = NullableResult::from(Some(4));
let result: Result<usize, isize> = Ok(4);
let nr = NullableResult::from(result);
§Unwrapping Conversions
There are also methods for unwrapping conversions. (i.e. convert to Option<T>
or
Result<T, E>
. When converting a a Result
, you need to provide an error value
in case the NullableResult
contains Null
.
let nr = NullableResult::<usize, isize>::Ok(5);
let opt = nr.option();
let res = nr.result(-5);
There are also a few convenience methods.
let nr: NullableResult<usize, isize> = NullableResult::Ok(4);
let _ : Option<Result<usize, isize>> = nr.optional_result();
let _: Result<Option<usize>, isize> = nr.resulting_option();
let _: Result<usize, Option<isize>> = nr.result_optional_err();
let _: Result<usize, isize> = nr.result(-5); // need to provide default error value
let _: Result<usize, isize> = nr.result_with(|| 5 - 10); //closure that returns a default error
Variants§
Implementations§
Source§impl<T, E: Debug> NullableResult<T, E>
impl<T, E: Debug> NullableResult<T, E>
Source§impl<T: Default, E> NullableResult<T, E>
impl<T: Default, E> NullableResult<T, E>
Sourcepub fn unwrap_or_default(self) -> T
pub fn unwrap_or_default(self) -> T
Returns the contained value if it’s Ok
, otherwise returns the default value
for that type.
Source§impl<T: Copy, E> NullableResult<&T, E>
impl<T: Copy, E> NullableResult<&T, E>
Sourcepub fn copied(self) -> NullableResult<T, E>
pub fn copied(self) -> NullableResult<T, E>
Returns a NullableResult
with the Ok
part copied.
Source§impl<T: Copy, E> NullableResult<&mut T, E>
impl<T: Copy, E> NullableResult<&mut T, E>
Sourcepub fn copied(self) -> NullableResult<T, E>
pub fn copied(self) -> NullableResult<T, E>
Returns a NullableResult
with the Ok
part copied.
Source§impl<T: Clone, E> NullableResult<&T, E>
impl<T: Clone, E> NullableResult<&T, E>
Sourcepub fn cloned(self) -> NullableResult<T, E>
pub fn cloned(self) -> NullableResult<T, E>
Returns a NullableResult
with the Ok
part cloned.
Source§impl<T: Clone, E> NullableResult<&mut T, E>
impl<T: Clone, E> NullableResult<&mut T, E>
Sourcepub fn cloned(self) -> NullableResult<T, E>
pub fn cloned(self) -> NullableResult<T, E>
Returns a NullableResult
with the Ok
part cloned.
Source§impl<T: Deref, E> NullableResult<T, E>
impl<T: Deref, E> NullableResult<T, E>
Sourcepub fn as_deref(&self) -> NullableResult<&T::Target, &E>
pub fn as_deref(&self) -> NullableResult<&T::Target, &E>
Coerce the Ok
variant of the original result with Deref
and returns the
new NullableResult
Source§impl<T, E> NullableResult<T, E>
impl<T, E> NullableResult<T, E>
Sourcepub fn unwrap_or(self, item: T) -> T
pub fn unwrap_or(self, item: T) -> T
Returns the contained value if it’s Ok
, returns item
otherwise.
Sourcepub fn unwrap_or_else<F: FnOnce() -> T>(self, f: F) -> T
pub fn unwrap_or_else<F: FnOnce() -> T>(self, f: F) -> T
Returns the contained value if it’s Ok
, otherwise, it calls f
and forwards
its return value.
Sourcepub fn option(self) -> Option<T>
pub fn option(self) -> Option<T>
Returns an Option<T>
consuming self
, returns Null
if the NullableResult
contains Err
.
Sourcepub fn optional_result(self) -> Option<Result<T, E>>
pub fn optional_result(self) -> Option<Result<T, E>>
Return an Option<Result<T, E>>
consuming self
.
Sourcepub fn resulting_option(self) -> Result<Option<T>, E>
pub fn resulting_option(self) -> Result<Option<T>, E>
Return a Result<Option<T>, E>
consuming self
.
Sourcepub fn result(self, err: E) -> Result<T, E>
pub fn result(self, err: E) -> Result<T, E>
Returns a Result<T, E>
, returns the provided err
if the NullableResult
contains Null
Sourcepub fn result_with<F: FnOnce() -> E>(self, f: F) -> Result<T, E>
pub fn result_with<F: FnOnce() -> E>(self, f: F) -> Result<T, E>
Returns a Result<T, E>
, if the NullableResult
contains Ok
or Err
, the
value is returned, otherwise, returns the result of f
.
Sourcepub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> NullableResult<U, E>
pub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> NullableResult<U, E>
Maps to a NullableResult
with a different ok type.
Sourcepub fn map_err<U, F: FnOnce(E) -> U>(self, f: F) -> NullableResult<T, U>
pub fn map_err<U, F: FnOnce(E) -> U>(self, f: F) -> NullableResult<T, U>
Maps to a NullableResult
with a different err type.
Sourcepub fn result_optional_err(self) -> Result<T, Option<E>>
pub fn result_optional_err(self) -> Result<T, Option<E>>
Returns a Result
with an optional error.
Sourcepub fn as_ref(&self) -> NullableResult<&T, &E>
pub fn as_ref(&self) -> NullableResult<&T, &E>
Convert from a NullableResult<T, E>
or &NullableResult<T, E>
to a
NullableResult<&T, &E>
.
Sourcepub fn as_mut(&mut self) -> NullableResult<&mut T, &mut E>
pub fn as_mut(&mut self) -> NullableResult<&mut T, &mut E>
Convert from a mut NullableResult<T, E>
or &mut NullableResult<T, E>
to a
NullableResult<&mut T, &mut E>
.
Sourcepub fn and<U>(self, res: NullableResult<U, E>) -> NullableResult<U, E>
pub fn and<U>(self, res: NullableResult<U, E>) -> NullableResult<U, E>
Sourcepub fn and_then<U, F>(self, op: F) -> NullableResult<U, E>where
F: FnOnce(T) -> NullableResult<U, E>,
pub fn and_then<U, F>(self, op: F) -> NullableResult<U, E>where
F: FnOnce(T) -> NullableResult<U, E>,
Source§impl<T, E> NullableResult<NullableResult<T, E>, E>
impl<T, E> NullableResult<NullableResult<T, E>, E>
Sourcepub fn flatten(self) -> NullableResult<T, E>
pub fn flatten(self) -> NullableResult<T, E>
Convert from NullableResult<NullableResult<T, E>, E>
to
NullableResult<T, E>
.
Trait Implementations§
Source§impl<T: Clone, E: Clone> Clone for NullableResult<T, E>
impl<T: Clone, E: Clone> Clone for NullableResult<T, E>
Source§fn clone(&self) -> NullableResult<T, E>
fn clone(&self) -> NullableResult<T, E>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<T, E> Default for NullableResult<T, E>
impl<T, E> Default for NullableResult<T, E>
Source§impl<T, E> From<NullableResult<T, E>> for Option<Result<T, E>>
impl<T, E> From<NullableResult<T, E>> for Option<Result<T, E>>
Source§fn from(nr: NullableResult<T, E>) -> Self
fn from(nr: NullableResult<T, E>) -> Self
Source§impl<T, E> From<NullableResult<T, E>> for Result<Option<T>, E>
impl<T, E> From<NullableResult<T, E>> for Result<Option<T>, E>
Source§fn from(nr: NullableResult<T, E>) -> Self
fn from(nr: NullableResult<T, E>) -> Self
Source§impl<T, E> From<Option<T>> for NullableResult<T, E>
impl<T, E> From<Option<T>> for NullableResult<T, E>
Source§impl<T, E> From<Result<T, E>> for NullableResult<T, E>
impl<T, E> From<Result<T, E>> for NullableResult<T, E>
Source§impl<T, E, C> FromIterator<NullableResult<T, E>> for NullableResult<C, E>where
C: FromIterator<T>,
impl<T, E, C> FromIterator<NullableResult<T, E>> for NullableResult<C, E>where
C: FromIterator<T>,
Source§fn from_iter<I: IntoIterator<Item = NullableResult<T, E>>>(iter: I) -> Self
fn from_iter<I: IntoIterator<Item = NullableResult<T, E>>>(iter: I) -> Self
Source§impl<T: Ord, E: Ord> Ord for NullableResult<T, E>
impl<T: Ord, E: Ord> Ord for NullableResult<T, E>
Source§fn cmp(&self, other: &NullableResult<T, E>) -> Ordering
fn cmp(&self, other: &NullableResult<T, E>) -> Ordering
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl<T: PartialOrd, E: PartialOrd> PartialOrd for NullableResult<T, E>
impl<T: PartialOrd, E: PartialOrd> PartialOrd for NullableResult<T, E>
impl<T: Copy, E: Copy> Copy for NullableResult<T, E>
impl<T: Eq, E: Eq> Eq for NullableResult<T, E>
impl<T, E> StructuralPartialEq for NullableResult<T, E>
Auto Trait Implementations§
impl<T, E> Freeze for NullableResult<T, E>
impl<T, E> RefUnwindSafe for NullableResult<T, E>where
T: RefUnwindSafe,
E: RefUnwindSafe,
impl<T, E> Send for NullableResult<T, E>
impl<T, E> Sync for NullableResult<T, E>
impl<T, E> Unpin for NullableResult<T, E>
impl<T, E> UnwindSafe for NullableResult<T, E>where
T: UnwindSafe,
E: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, U> MaybeTryFrom<T> for Uwhere
U: TryFrom<T>,
impl<T, U> MaybeTryFrom<T> for Uwhere
U: TryFrom<T>,
Source§fn maybe_try_from(item: T) -> NullableResult<U, <U as MaybeTryFrom<T>>::Error>
fn maybe_try_from(item: T) -> NullableResult<U, <U as MaybeTryFrom<T>>::Error>
T
to NullableResult<Self, Self::Error>
Source§impl<T, U> MaybeTryInto<U> for Twhere
U: MaybeTryFrom<T>,
impl<T, U> MaybeTryInto<U> for Twhere
U: MaybeTryFrom<T>,
Source§type Error = <U as MaybeTryFrom<T>>::Error
type Error = <U as MaybeTryFrom<T>>::Error
Source§fn maybe_try_into(self) -> NullableResult<U, <T as MaybeTryInto<U>>::Error>
fn maybe_try_into(self) -> NullableResult<U, <T as MaybeTryInto<U>>::Error>
Self
to NullableResult<T, Self::Error>