#![no_std]
extern crate alloc;
use alloc::fmt::{Debug, Formatter, Result as FormatResult};
use alloc::string::String;
#[doc(hidden)]
pub struct RawString(pub String);
impl Debug for RawString {
fn fmt(&self, f: &mut Formatter<'_>) -> FormatResult {
if f.alternate() {
f.write_str(self.0.replace('\n', "\n ").as_str())
} else {
f.write_str(self.0.as_str())
}
}
}
#[macro_export]
macro_rules! impl_debug_for_struct {
($struct_name:ident, $formatter:expr $(, $self:expr)? $(,)*) => {
return $formatter.write_str(stringify!($struct_name));
};
($struct_name:ident, $formatter:expr, $self:expr, $( $(.$field:ident)? $((.$field_2:ident, $($field_2_fmt:tt)+))? $(let .$field_3:ident = $field_3_value:expr)? ),* $(,)*) => {
{
let mut builder = $formatter.debug_struct(stringify!($struct_name));
$(
$(
builder.field(stringify!($field), &$self.$field);
)?
$(
builder.field(stringify!($field_2), &$crate::RawString(format!($($field_2_fmt)*)));
)?
$(
builder.field(stringify!($field_3), &$field_3_value);
)?
)*
return builder.finish();
}
};
}
#[macro_export]
macro_rules! impl_debug_for_tuple_struct {
($struct_name:ident, $formatter:expr $(, $self:expr)? $(,)*) => {
return $formatter.write_str(stringify!($struct_name));
};
($struct_name:ident, $formatter:expr, $self:expr, $( $(.$field:tt)? $((.$field_2:tt, $($field_2_fmt:tt)+))? $(let .$field_3:tt = $field_3_value:expr)? ),* $(,)*) => {
{
let mut builder = $formatter.debug_tuple(stringify!($struct_name));
$(
$(
builder.field(&$self.$field);
)?
$(
builder.field(&$crate::RawString(format!($($field_2_fmt)*)));
)?
$(
builder.field(&$field_3_value);
)?
)*
return builder.finish();
}
}
}
#[macro_export]
macro_rules! impl_debug_for_enum {
($enum_name:ident::{$( $($variant_unit:ident)? $(($variant_tuple:ident ($($tuple:tt)*) $(:($( $(.$t_field:tt)? $((.$t_field_2:tt, $($t_field_2_fmt:tt)+))? $(let .$t_field_3:tt = $t_field_3_value:expr)? ),* $(,)*))? ) )? $({$variant_struct:ident {$($struct:tt)*} $(:($( $(.$s_field:tt)? $((.$s_field_2:tt, $($s_field_2_fmt:tt)+))? $(let .$s_field_3:ident = $s_field_3_value:expr)? ),* $(,)*))? })? ),+ $(,)*}, $formatter:expr, $self:expr $(,)*) => {
{
match $self {
$(
$(
Self::$variant_unit => {
return $formatter.write_str(stringify!($variant_unit));
}
)?
$(
Self::$variant_tuple ($($tuple)*)=> {
let mut builder = $formatter.debug_tuple(stringify!($variant_tuple));
$(
$(
$(
builder.field(&$t_field);
)?
$(
builder.field(&$crate::RawString(format!($($t_field_2_fmt)*)));
)?
$(
builder.field(&$t_field_3_value);
)?
)*
)?
return builder.finish();
}
)?
$(
Self::$variant_struct {$($struct)*}=> {
let mut builder = $formatter.debug_struct(stringify!($variant_struct));
$(
$(
$(
builder.field(stringify!($s_field), &$s_field);
)?
$(
builder.field(stringify!($s_field_2), &$crate::RawString(format!($($s_field_2_fmt)*)));
)?
$(
builder.field(stringify!($s_field_3), &$s_field_3_value);
)?
)*
)?
return builder.finish();
}
)?
)+
}
}
};
({$enum_name:ident::$( $($variant_unit:ident)? $(($variant_tuple:ident ($($tuple:tt)*) $(:($( $(.$t_field:tt)? $((.$t_field_2:tt, $($t_field_2_fmt:tt)+))? $(let .$t_field_3:tt = $t_field_3_value:expr)? ),* $(,)*))? ) )? $({$variant_struct:ident {$($struct:tt)*} $(:($( $(.$s_field:tt)? $((.$s_field_2:tt, $($s_field_2_fmt:tt)+))? $(let .$s_field_3:ident = $s_field_3_value:expr)? ),* $(,)*))? })? ),+ $(,)*}, $formatter:expr, $self:expr $(,)*) => {
{
match $self {
$(
$(
Self::$variant_unit => {
$formatter.write_str(stringify!($enum_name))?;
$formatter.write_str("::")?;
return $formatter.write_str(stringify!($variant_unit));
}
)?
$(
Self::$variant_tuple ($($tuple)*)=> {
let mut builder = $formatter.debug_tuple(&format!("{}::{}", stringify!($enum_name), stringify!($variant_tuple)));
$(
$(
$(
builder.field(&$t_field);
)?
$(
builder.field(&$crate::RawString(format!($($t_field_2_fmt)*)));
)?
$(
builder.field(&$t_field_3_value);
)?
)*
)?
return builder.finish();
}
)?
$(
Self::$variant_struct {$($struct)*}=> {
let mut builder = $formatter.debug_struct(&format!("{}::{}", stringify!($enum_name), stringify!($variant_struct)));
$(
$(
$(
builder.field(stringify!($s_field), &$s_field);
)?
$(
builder.field(stringify!($s_field_2), &$crate::RawString(format!($($s_field_2_fmt)*)));
)?
$(
builder.field(stringify!($s_field_3), &$s_field_3_value);
)?
)*
)?
return builder.finish();
}
)?
)+
}
}
};
}