#![doc = include_str!(concat!("../", std::env!("CARGO_PKG_README")))]
pub use easyerr_derive::Error;
pub mod prelude {
pub use crate::*;
}
pub trait ErrorContext {
type Source: std::error::Error;
type Err: std::error::Error;
fn add_to_source(self, source: Self::Source) -> Self::Err;
}
pub trait ResultExt<T, E1> {
fn context<C, E2>(self, ctx: C) -> Result<T, E2>
where
C: ErrorContext<Err = E2, Source = E1>;
fn with_context<C, E2, F>(self, f: F) -> Result<T, E2>
where
F: FnOnce(&E1) -> C,
C: ErrorContext<Err = E2, Source = E1>;
}
impl<T, E1> ResultExt<T, E1> for Result<T, E1> {
#[inline(always)]
fn context<C, E2>(self, ctx: C) -> Result<T, E2>
where
C: ErrorContext<Err = E2, Source = E1>,
{
self.map_err(|e| ctx.add_to_source(e))
}
#[inline(always)]
fn with_context<C, E2, F>(self, f: F) -> Result<T, E2>
where
F: FnOnce(&E1) -> C,
C: ErrorContext<Err = E2, Source = E1>,
{
self.map_err(|e| f(&e).add_to_source(e))
}
}
#[macro_export]
macro_rules! ensure {
($cond:expr, $e:expr $(,)?) => {
if !($cond) {
return Err($e.into());
}
};
}