use std::error::Error;
use crate::LoggableError;
macro_rules! generate_impl {
($err:ty) => {
impl<T> LoggableError<T> for Result<T, $err> {
fn print_error<F: Fn(&str)>(self, fun: F) -> Self {
if let Err(ref err) = self {
let mut msg = format!("ERROR: {err}");
if let Some(cause) = err.source() {
msg = format!("{msg}\ncause: {}", cause.to_string());
}
fun(&msg);
}
self
}
}
}
}
generate_impl!(std::alloc::LayoutError);
generate_impl!(std::cell::BorrowError);
generate_impl!(std::cell::BorrowMutError);
generate_impl!(std::char::CharTryFromError);
generate_impl!(std::char::DecodeUtf16Error);
generate_impl!(std::char::ParseCharError);
generate_impl!(std::char::TryFromCharError);
generate_impl!(std::collections::TryReserveError);
generate_impl!(std::convert::Infallible);
generate_impl!(std::env::JoinPathsError);
generate_impl!(std::env::VarError);
generate_impl!(std::ffi::FromBytesWithNulError);
generate_impl!(std::ffi::FromVecWithNulError);
generate_impl!(std::ffi::IntoStringError);
generate_impl!(std::ffi::NulError);
generate_impl!(std::fmt::Error);
generate_impl!(std::io::Error);
impl<T, W: Send + std::fmt::Debug> LoggableError<T> for Result<T, std::io::IntoInnerError<W>> {
fn print_error<F: Fn(&str)>(self, fun: F) -> Self {
if let Err(ref err) = self {
let mut msg = format!("ERROR: {err}");
if let Some(cause) = err.source() {
msg = format!("{msg}\ncause: {}", cause.to_string());
}
fun(&msg);
}
self
}
}
generate_impl!(std::io::WriterPanicked);
generate_impl!(std::net::AddrParseError);
generate_impl!(std::num::ParseFloatError);
generate_impl!(std::num::ParseIntError);
generate_impl!(std::num::TryFromIntError);
#[cfg(windows)]
generate_impl!(std::os::windows::io::InvalidHandleError);
#[cfg(windows)]
generate_impl!(std::os::windows::io::NullHandleError);
generate_impl!(std::path::StripPrefixError);
generate_impl!(std::str::ParseBoolError);
generate_impl!(std::str::Utf8Error);
generate_impl!(std::string::FromUtf8Error);
generate_impl!(std::string::FromUtf16Error);
generate_impl!(std::sync::PoisonError<T>);
generate_impl!(std::sync::TryLockError<T>);
generate_impl!(std::thread::AccessError);
generate_impl!(std::time::SystemTimeError);