pub trait MaybeDebug {
fn is_debug() -> bool;
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result;
}
impl<T> MaybeDebug for T {
default fn is_debug() -> bool {
false
}
default fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let size = std::mem::size_of_val(self);
write!(f, "<object of {} bytes>", size)
}
}
impl<T: std::fmt::Debug> MaybeDebug for T {
fn is_debug() -> bool {
true
}
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
std::fmt::Debug::fmt(self, f)
}
}
pub struct DebugWrapper<'a, T>(&'a T);
impl<T: MaybeDebug> std::fmt::Debug for DebugWrapper<'_, T> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
MaybeDebug::fmt(self.0, f)
}
}
pub fn wrap<T: MaybeDebug>(value: &T) -> DebugWrapper<T> {
DebugWrapper(value)
}