#derive #macro-derive #customizable #enums

derive-debug

为Debug特性定制的衍生宏

3个版本

0.1.2 2023年1月20日
0.1.1 2023年1月20日
0.1.0 2023年1月18日

调试 中排名第658

Download history 557/week @ 2024-03-14 482/week @ 2024-03-21 599/week @ 2024-03-28 499/week @ 2024-04-04 999/week @ 2024-04-11 1227/week @ 2024-04-18 1443/week @ 2024-04-25 1189/week @ 2024-05-02 1183/week @ 2024-05-09 1405/week @ 2024-05-16 1343/week @ 2024-05-23 1698/week @ 2024-05-30 1567/week @ 2024-06-06 1902/week @ 2024-06-13 1969/week @ 2024-06-20 1614/week @ 2024-06-27

每月下载量 7,361
6 个Crates中使用了(直接使用3个)

MIT 许可证

19KB
342

derive-debug

此crate实现了一个更可定制的 #[derive(Debug)] 版本。

使用方法

使用方法与 #[derive(Debug)] 非常相似,但增加了一些额外的定制选项。

结构体的衍生

use derive_debug::Dbg;

#[derive(Dbg)]
struct Foo {
    field_a: u32,
    #[dbg(placeholder = "...")]
    field_b: Vec<u32>, // will be printed as "field_b: ..."
    #[dbg(skip)]
    field_c: bool, // will be left out
    #[dbg(alias = "my_string")]
    field_d: u32, // will be printed as "my_string: 42"
    #[dbg(fmt = "{:#06X}")]
    field_e: u32, // will be printed with the specified format
}

枚举的衍生

use derive_debug::Dbg;

#[derive(Dbg)]
enum Foo {
    VariantA(u32, u32, u32),
    #[dbg(skip)]
    VariantB{a: u32, b: bool}, // Will be printed as "VariantB"

    // same options available as for struct fields
    VariantC{a: u32, #[dbg(placeholder = "...")] b: bool}
}

详细选项

字段选项

  • #[dbg(skip)] 完全省略输出中的字段
    use derive_debug::Dbg;

    #[derive(Dbg)]
    struct Foo {
        field_a: bool,
        #[dbg(skip)]
        field_b: u32,
    }

    // Outputs: Foo { field_a: true }
  • #[dbg(placeholder = "xyz")] 将打印 xyz 而不是字段的实际内容
    use derive_debug::Dbg;

    #[derive(Dbg)]
    struct Foo {
        field_a: bool,
        #[dbg(placeholder = "...")]
        field_b: u32,
    }

    // Outputs: Foo { field_a: true, field_b: ... }
  • #[dbg(alias = "some_alias")] 将打印 some_alias 作为字段名而不是真实名称
    use derive_debug::Dbg;

    #[derive(Dbg)]
    struct Foo {
        field_a: bool,
        #[dbg(alias="not_field_b")]
        field_b: u32,
    }

    // Outputs: Foo { field_a: true, not_field_b: 42 }
  • #[dbg(fmt = "{:#06X}")] 将以指定的格式打印字段
    use derive_debug::Dbg;

    #[derive(Dbg)]
    struct Foo {
        field_a: bool,
        #[dbg(fmt = "{:#06X}")]
        field_b: u32,
    }

    // Outputs: Foo { field_a: true, field_b: 0x002A }
  • #[dbg(formatter = "my_func")] 将使用指定的函数打印字段。
    函数必须返回一个可以使用 "{}" 格式的类型。
    use derive_debug::Dbg;

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

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

    // Outputs: Foo(42, not 0)

枚举变体选项

  • #[dbg(skip)] 仅打印变体的名称并省略其内容
    use derive_debug::Dbg;

    #[derive(Dbg)]
    enum Foo {
        #[dbg(skip)]
        SomeVariant{a: bool, b: u32},
    }

    // Outputs: SomeVariant
  • #[dbg(alias = "some_alias")] 将使用 some_alias 作为变体名称而不是真实名称
    use derive_debug::Dbg;

    #[derive(Dbg)]
    enum Foo {
        #[dbg(alias = "NotSomeVariant")]
        SomeVariant{a: bool, b: u32},
    }

    // Outputs: NotSomeVariant { a: true, b: 42 }

struct 选项

  • #[dbg(alias = "MyAlias")] 将使用 MyAlias 作为结构体名称而不是真实名称
    use derive_debug::Dbg;

    #[derive(Dbg)]
    #[dbg(alias = "NotFoo")]
    struct Foo {
        field_a: bool,
        field_b: u32,
    }

    // Outputs: NotFoo { field_a: true, not_field_b: 42 }

依赖关系

~1.5MB
~35K SLoC