use Resultish::{Both, Err, Ok};
#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
#[must_use]
pub enum Resultish<T, E> {
Ok(T),
Err(E),
Both(T, E),
}
impl<T, E> Resultish<T, E> {
pub fn as_mut(&mut self) -> Resultish<&mut T, &mut E> {
match self {
Ok(ok) => Ok(ok),
Err(err) => Err(err),
Both(ok, err) => Both(ok, err),
}
}
pub fn as_ref(&self) -> Resultish<&T, &E> {
match self {
Ok(ok) => Ok(ok),
Err(err) => Err(err),
Both(ok, err) => Both(ok, err),
}
}
pub fn has_ok(&self) -> bool {
matches!(self, Ok(_) | Both(_, _))
}
pub fn has_err(&self) -> bool {
matches!(self, Err(_) | Both(_, _))
}
pub fn lenient(self) -> Result<T, E> {
match self {
Ok(ok) => Result::Ok(ok),
Err(err) => Result::Err(err),
Both(ok, _) => Result::Ok(ok),
}
}
pub fn lenient_err(self) -> Option<E> {
match self {
Ok(_) => None,
Err(err) => Some(err),
Both(_, _) => None,
}
}
pub fn lenient_ok(self) -> Option<T> {
match self {
Ok(ok) => Some(ok),
Err(_) => None,
Both(ok, _) => Some(ok),
}
}
pub fn map<U, F>(self, op: F) -> Resultish<U, E>
where
F: FnOnce(T) -> U,
{
match self {
Ok(ok) => Ok(op(ok)),
Err(err) => Err(err),
Both(ok, err) => Both(op(ok), err),
}
}
pub fn map_err<F, O>(self, op: O) -> Resultish<T, F>
where
O: FnOnce(E) -> F,
{
match self {
Ok(ok) => Ok(ok),
Err(err) => Err(op(err)),
Both(ok, err) => Both(ok, op(err)),
}
}
pub fn strict(self) -> Result<T, E> {
match self {
Ok(ok) => Result::Ok(ok),
Err(err) => Result::Err(err),
Both(_, err) => Result::Err(err),
}
}
pub fn strict_err(self) -> Option<E> {
match self {
Ok(_) => None,
Err(err) => Some(err),
Both(_, err) => Some(err),
}
}
pub fn strict_ok(self) -> Option<T> {
match self {
Ok(ok) => Some(ok),
Err(_) => None,
Both(_, _) => None,
}
}
pub fn tuple(self) -> (Option<T>, Option<E>) {
match self {
Ok(ok) => (Some(ok), None),
Err(err) => (None, Some(err)),
Both(ok, err) => (Some(ok), Some(err)),
}
}
}
impl<T, E> Resultish<&T, E> {
pub fn cloned(self) -> Resultish<T, E>
where
T: Clone,
{
match self {
Ok(ok) => Ok(ok.clone()),
Err(err) => Err(err),
Both(ok, err) => Both(ok.clone(), err),
}
}
pub fn copied(self) -> Resultish<T, E>
where
T: Copy,
{
match self {
Ok(ok) => Ok(*ok),
Err(err) => Err(err),
Both(ok, err) => Both(*ok, err),
}
}
}
impl<T, E> Resultish<&mut T, E> {
pub fn cloned(self) -> Resultish<T, E>
where
T: Clone,
{
match self {
Ok(ok) => Ok(ok.clone()),
Err(err) => Err(err),
Both(ok, err) => Both(ok.clone(), err),
}
}
pub fn copied(self) -> Resultish<T, E>
where
T: Copy,
{
match self {
Ok(ok) => Ok(*ok),
Err(err) => Err(err),
Both(ok, err) => Both(*ok, err),
}
}
}
impl<T, E> From<Result<T, E>> for Resultish<T, E> {
fn from(value: Result<T, E>) -> Self {
match value {
Result::Ok(ok) => Ok(ok),
Result::Err(err) => Err(err),
}
}
}