use std::fmt::Display;
pub use errata_macros::catch;
#[doc(hidden)]
#[derive(Debug)]
pub struct ErrataPanic(pub String);
impl Display for ErrataPanic {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[cfg(not(feature = "color"))]
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {
std::panic::panic_any($crate::ErrataPanic(format!($($arg)*)));
}
}
#[cfg(feature = "color")]
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {
std::panic::panic_any($crate::ErrataPanic(format!("\x1b[38;5;1m\x1b[1m{}\x1b[0m", format!($($arg)*))));
}
}
pub trait FallibleExt<T> {
fn fail(self, msg: impl Display) -> T;
}
impl<T> FallibleExt<T> for Option<T> {
#[cfg(not(feature = "color"))]
fn fail(self, msg: impl Display) -> T {
match self {
Some(t) => t,
None => std::panic::panic_any(ErrataPanic(format!("{msg}"))),
}
}
#[cfg(feature = "color")]
fn fail(self, msg: impl Display) -> T {
match self {
Some(t) => t,
None => std::panic::panic_any(ErrataPanic(format!("\x1b[38;5;1m\x1b[1m{msg}\x1b[0m"))),
}
}
}
impl<T, E: Display> FallibleExt<T> for Result<T, E> {
#[cfg(not(feature = "color"))]
fn fail(self, msg: impl Display) -> T {
match self {
Ok(t) => t,
Err(e) => std::panic::panic_any(ErrataPanic(format!("{msg}: {e}"))),
}
}
#[cfg(feature = "color")]
fn fail(self, msg: impl Display) -> T {
match self {
Ok(t) => t,
Err(e) => {
std::panic::panic_any(ErrataPanic(format!("\x1b[38;5;1m\x1b[1m{msg}: {e}\x1b[0m")))
}
}
}
}