use core::error::Error;
use crate::Exn;
pub type Result<T, E> = core::result::Result<T, Exn<E>>;
pub trait ResultExt {
type Success;
type Error: Error + Send + Sync + 'static;
fn or_raise<A, F>(self, err: F) -> Result<Self::Success, A>
where
A: Error + Send + Sync + 'static,
F: FnOnce() -> A;
}
impl<T, E> ResultExt for core::result::Result<T, E>
where
E: Error + Send + Sync + 'static,
{
type Success = T;
type Error = E;
#[track_caller]
fn or_raise<A, F>(self, err: F) -> Result<Self::Success, A>
where
A: Error + Send + Sync + 'static,
F: FnOnce() -> A,
{
match self {
Ok(v) => Ok(v),
Err(e) => Err(Exn::new(e).raise(err())),
}
}
}
impl<T, E> ResultExt for core::result::Result<T, Exn<E>>
where
E: Error + Send + Sync + 'static,
{
type Success = T;
type Error = E;
#[track_caller]
fn or_raise<A, F>(self, err: F) -> Result<Self::Success, A>
where
A: Error + Send + Sync + 'static,
F: FnOnce() -> A,
{
match self {
Ok(v) => Ok(v),
Err(e) => Err(e.raise(err())),
}
}
}