#debugging #formatting #derive #macro-derive #fields #smart

smart-debug

Derive macro for Debug with easy manipulation of fields

3 releases

0.0.3 Nov 5, 2023
0.0.2 Jul 25, 2023
0.0.1 Jul 23, 2023

#96 in Value formatting

Download history 25/week @ 2024-01-09 99/week @ 2024-01-16 159/week @ 2024-01-23 71/week @ 2024-01-30 47/week @ 2024-02-06 261/week @ 2024-02-13 141/week @ 2024-02-20 65/week @ 2024-02-27 133/week @ 2024-03-05 172/week @ 2024-03-12 124/week @ 2024-03-19 125/week @ 2024-03-26 243/week @ 2024-04-02 104/week @ 2024-04-09 65/week @ 2024-04-16 104/week @ 2024-04-23

581 downloads per month
Used in inlyne

MIT/Apache

11KB
73 lines

⚠️ !!This is currently pre-alpha software!! ⚠️

Allows for easy manipulation of debug formatting through a derive macro

use smart_debug::SmartDebug;
use std::fmt;

#[derive(SmartDebug, Default)]
#[debug(skip_defaults)]
struct Text {
    #[debug(no_skip)]
    text: &'static str,
    #[debug("0x{:06x}")]
    color: u32,
    #[debug(wrapper = DebugInline)]
    hyperlink: Option<&'static str>,
    is_bold: bool,
    is_italics: bool,
}

// Wrapper that displays inline even when using pretty formatting (`{:#?}`)
struct DebugInline<'inner, T>(pub &'inner T);

impl<T: fmt::Debug> fmt::Debug for DebugInline<'_, T> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_fmt(format_args!("{:?}", self.0))
    }
}

const HYPERLINK: &str = r#"
Text {
    text: "Look! A link",
    color: 0x005cc5,
    hyperlink: Some("https://example.org"),
    is_italics: true,
    ..
}
"#;

fn main() {
    let hyperlink = Text {
        text: "Look! A link",
        hyperlink: Some("https://example.org"),
        color: 0x00_5c_c5,
        is_italics: true,
        ..Text::default()
    };

    let formatted = format!("\n{hyperlink:#?}\n");
    assert_eq!(formatted, HYPERLINK);
}

Dependencies

~325–780KB
~19K SLoC