lazy_panic/lib.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
//! Provides lazy utilities to lazily set custom panic hook.
///Formats ```PanicInfo``` payload into ```String```
///
///# Arguments
///
///* ```payload``` - ```PanicInfo``` payload message.
///* ```p_type``` - Multiple number of types which payload can be. If not among these types then it
///is formatted as ```{:?}```
///
///# Return
///
///Result of `write!` macro
#[macro_export]
macro_rules! write_payload {
($writer:expr, $payload:expr, types: [$($p_type:ty),+]) => {{
$(
if let Some(result) = $payload.downcast_ref::<$p_type>() {
write!($writer, "{}", result)
}
)else+
else {
write!($writer, "{:?}", $payload)
}
}}
}
///Sets custom printer for panic.
///
///# Arguments
///
///* ```Config``` - panic formatter that implements [PanicFormat](formatter/trait.PanicFormat.html)
#[macro_export]
macro_rules! set_panic_message {
($config:ty) => {{
use std::panic;
use $crate::formatter::PanicFormat;
type Printer = $config;
panic::set_hook(Box::new(move |info| {
Printer::print(&info);
}))
}}
}
pub mod formatter;