use core::fmt::Debug;
mod error;
pub use error::Error;
mod status;
pub use status::{Status, StatusExt};
pub type Result<Output = (), ErrData = ()> = core::result::Result<Output, Error<ErrData>>;
pub trait ResultExt<Output, ErrData: Debug> {
fn status(&self) -> Status;
fn discard_errdata(self) -> Result<Output>;
fn handle_warning<O>(self, op: O) -> Result<Output, ErrData>
where
O: FnOnce(Error<ErrData>) -> Result<Output, ErrData>;
}
impl<Output, ErrData: Debug> ResultExt<Output, ErrData> for Result<Output, ErrData> {
fn status(&self) -> Status {
match self {
Ok(_) => Status::SUCCESS,
Err(e) => e.status(),
}
}
fn discard_errdata(self) -> Result<Output> {
match self {
Ok(o) => Ok(o),
Err(e) => Err(e.status().into()),
}
}
fn handle_warning<O>(self, op: O) -> Self
where
O: FnOnce(Error<ErrData>) -> Self,
{
match self {
Ok(output) => Ok(output),
Err(err) => {
if err.status().is_warning() {
op(err)
} else {
Err(err)
}
}
}
}
}