derive-debug-plus 0.5.0

Customizable derive macro for Debug trait
Documentation
#![allow(unused, clippy::enum_variant_names, clippy::disallowed_names)]

use derive_debug_plus::Dbg;

#[derive(Dbg, Default)]
#[dbg(alias = &format!("TestStructAlias {}", 123))]
struct TestStruct {
    plain_field: u32,
    #[dbg(skip)]
    skipped_field: u32,
    #[dbg(alias = "alias_field_alias")]
    alias_field: u32,
    #[dbg(placeholder = "...")]
    placeholder_field: u32,
    #[dbg(alias = "alias_placeholder_field_alias", placeholder = "abc")]
    alias_placeholder_field: u32,
    #[dbg(fmt = "{:#06X}")]
    fmt_field: u32,
    #[dbg(expr = &"123")]
    expr_field: u32,
    #[dbg(flat_option)]
    flat_opt: Option<u32>,
    #[dbg(flat_option)]
    flat_opt_some: Option<u32>,
    #[dbg(sort = -1)]
    sort: u32,
}

#[test]
fn test_struct() {
    let foo = TestStruct {
        fmt_field: 0xAB,
        flat_opt_some: Some(1),
        ..TestStruct::default()
    };

    println!("\n{:#?}\n", foo);

    assert_eq!(
        format!("\n{:#?}\n", foo),
        r#"
TestStructAlias 123 {
    sort: 0,
    plain_field: 0,
    alias_field_alias: 0,
    placeholder_field: ...,
    alias_placeholder_field_alias: abc,
    fmt_field: 0x00AB,
    expr_field: "123",
    flat_opt_some: 1,
}
"#
    );
}

#[derive(Dbg)]
struct TestTuple(u32, #[dbg(formatter = fmt_not_zero)] u32);

fn fmt_not_zero(v: &u32) -> &'static str {
    if *v == 0 {
        "0"
    } else {
        "not 0"
    }
}

#[test]
fn test_tuple() {
    let foo = TestTuple(42, 17);

    assert_eq!(format!("{:?}", foo), "TestTuple(42, not 0)");
}

#[derive(Dbg)]
enum TestEnum {
    UnitVariant,
    TupleVariant(u32, u32),
    StructVariant {
        a: u32,
        b: u32,
    },

    #[dbg(skip)]
    SkippedUnitVariant,
    #[dbg(skip)]
    SkippedTupleVariant(u32, u32),
    #[dbg(skip)]
    SkippedStructVariant {
        a: u32,
        b: u32,
    },

    #[dbg(alias = "AliasVariant")]
    AliasedUnitVariant,
    #[dbg(alias = "AliasVariant")]
    AliasedTupleVariant(u32, u32),
    #[dbg(alias = "AliasVariant")]
    AliasedStructVariant {
        a: u32,
        b: u32,
    },
}

#[test]
fn test_unit_variant() {
    let foo = TestEnum::UnitVariant;
    assert_eq!(format!("{:?}", foo), "UnitVariant");
}

#[test]
fn test_tuple_variant() {
    let foo = TestEnum::TupleVariant(0, 1);
    assert_eq!(format!("{:?}", foo), "TupleVariant(0, 1)");
}

#[test]
fn test_struct_variant() {
    let foo = TestEnum::StructVariant { a: 0, b: 1 };
    assert_eq!(format!("{:?}", foo), "StructVariant { a: 0, b: 1 }");
}

#[test]
fn test_skipped_unit_variant() {
    let foo = TestEnum::SkippedUnitVariant;
    assert_eq!(format!("{:?}", foo), "SkippedUnitVariant");
}

#[test]
fn test_skipped_tuple_variant() {
    let foo = TestEnum::SkippedTupleVariant(0, 1);
    assert_eq!(format!("{:?}", foo), "SkippedTupleVariant");
}

#[test]
fn test_skipped_struct_variant() {
    let foo = TestEnum::SkippedStructVariant { a: 0, b: 1 };
    assert_eq!(format!("{:?}", foo), "SkippedStructVariant");
}

#[test]
fn test_aliased_unit_variant() {
    let foo = TestEnum::AliasedUnitVariant;
    assert_eq!(format!("{:?}", foo), "AliasVariant");
}

#[test]
fn test_aliased_tuple_variant() {
    let foo = TestEnum::AliasedTupleVariant(0, 1);
    assert_eq!(format!("{:?}", foo), "AliasVariant(0, 1)");
}

#[test]
fn test_aliased_struct_variant() {
    let foo = TestEnum::AliasedStructVariant { a: 0, b: 1 };
    assert_eq!(format!("{:?}", foo), "AliasVariant { a: 0, b: 1 }");
}