#![forbid(unsafe_code)]
#![warn(clippy::pedantic)]
use std::future::Future;
#[allow(async_fn_in_trait)]
pub trait AsyncOptionExt<T> {
async fn async_map<U, Fut: Future<Output = U>, F: FnOnce(T) -> Fut>(self, f: F) -> Option<U>;
}
pub trait ResultOptionExt<T, E> {
fn unwrap_or_err<E2>(self, err: E2) -> Result<T, E2>;
fn unwrap_or_else_err<E2, F: FnOnce() -> E2>(self, f: F) -> Result<T, E2>;
fn unwrap_or_map_err<E2, F: FnOnce(E) -> E2>(self, default: E2, f: F) -> Result<T, E2>;
fn unwrap_or_else_map_err<E2, F: FnOnce(E) -> E2, F2: FnOnce() -> E2>(self, default: F2, f: F) -> Result<T, E2>;
}
impl<T> AsyncOptionExt<T> for Option<T> {
async fn async_map<U, Fut: Future<Output = U>, F: FnOnce(T) -> Fut>(self, f: F) -> Option<U> {
match self {
Some(t) => Some(f(t).await),
None => None,
}
}
}
impl<T, E> ResultOptionExt<T, E> for Option<Result<T, E>> {
fn unwrap_or_err<E2>(self, err: E2) -> Result<T, E2> {
match self {
Some(Ok(t)) => Ok(t),
Some(Err(_)) => Err(err),
None => Err(err),
}
}
fn unwrap_or_else_err<E2, F: FnOnce() -> E2>(self, f: F) -> Result<T, E2> {
match self {
Some(Ok(t)) => Ok(t),
Some(Err(_)) => Err(f()),
None => Err(f()),
}
}
fn unwrap_or_map_err<E2, F: FnOnce(E) -> E2>(self, default: E2, f: F) -> Result<T, E2> {
match self {
Some(Ok(t)) => Ok(t),
Some(Err(e)) => Err(f(e)),
None => Err(default),
}
}
fn unwrap_or_else_map_err<E2, F: FnOnce(E) -> E2, F2: FnOnce() -> E2>(self, default: F2, f: F) -> Result<T, E2> {
match self {
Some(Ok(t)) => Ok(t),
Some(Err(e)) => Err(f(e)),
None => Err(default()),
}
}
}
impl<T, E> ResultOptionExt<T, E> for Result<Option<T>, E> {
fn unwrap_or_err<E2>(self, err: E2) -> Result<T, E2> {
match self {
Ok(t) => match t {
Some(t) => Ok(t),
None => Err(err),
},
Err(_) => Err(err),
}
}
fn unwrap_or_else_err<E2, F: FnOnce() -> E2>(self, f: F) -> Result<T, E2> {
match self {
Ok(t) => match t {
Some(t) => Ok(t),
None => Err(f()),
},
Err(_) => Err(f()),
}
}
fn unwrap_or_map_err<E2, F: FnOnce(E) -> E2>(self, default: E2, f: F) -> Result<T, E2> {
match self {
Ok(t) => match t {
Some(t) => Ok(t),
None => Err(default),
},
Err(e) => Err(f(e)),
}
}
fn unwrap_or_else_map_err<E2, F: FnOnce(E) -> E2, F2: FnOnce() -> E2>(self, default: F2, f: F) -> Result<T, E2> {
match self {
Ok(t) => match t {
Some(t) => Ok(t),
None => Err(default()),
},
Err(e) => Err(f(e)),
}
}
}