From c2e43b8abfbddb26a7086d12be2cb0e2af345fbd Mon Sep 17 00:00:00 2001 From: Robin Krahl Date: Mon, 14 Oct 2024 17:14:57 +0200 Subject: [PATCH] Add DelogPanic trait and delog_panic macro --- src/lib.rs | 2 ++ src/panic.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/panic.rs diff --git a/src/lib.rs b/src/lib.rs index 5b0e009..66be942 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -113,11 +113,13 @@ pub mod hex; mod logger; mod macros; +mod panic; pub mod render; pub use logger::{ dequeue, enqueue, try_enqueue, Delogger, State, Statistics, TryLog, TryLogWithStatistics, }; +pub use panic::DelogPanic; /// A way to pass on logs, user supplied. /// diff --git a/src/panic.rs b/src/panic.rs new file mode 100644 index 0000000..834f8b8 --- /dev/null +++ b/src/panic.rs @@ -0,0 +1,50 @@ +use core::fmt::Debug; + +#[macro_export] +macro_rules! delog_panic { + ($($arg:tt)*) => {{ + error_now!($($arg)*); + panic!(); + }}; +} + +pub trait DelogPanic { + fn delog_unwrap(self) -> T; + fn delog_expect(self, msg: &str) -> T; +} + +impl DelogPanic for Option { + #[inline(always)] + fn delog_unwrap(self) -> T { + match self { + Some(t) => t, + None => delog_panic!("Called `Option::delog_unwrap` on a `None` value"), + } + } + + #[inline(always)] + fn delog_expect(self, _msg: &str) -> T { + match self { + Some(t) => t, + None => delog_panic!("{_msg}"), + } + } +} + +impl DelogPanic for Result { + #[inline(always)] + fn delog_unwrap(self) -> T { + match self { + Ok(t) => t, + Err(_e) => delog_panic!("Called `Result::delog_unwrap` on an `Err` value: {_e:?}"), + } + } + + #[inline(always)] + fn delog_expect(self, _msg: &str) -> T { + match self { + Ok(t) => t, + Err(_e) => delog_panic!("{_msg}: {_e:?}"), + } + } +}