#attributes #enums #attr #variant #declaration #value #fields

custom_attrs

一个库,允许您配置枚举每个变体的特定值

10个稳定版本

1.6.2 2023年3月26日
1.6.0 2023年3月9日
1.5.3 2023年2月25日

284进程宏

每月30次下载

MIT 协议

59KB
1K SLoC

Custom Attrs

Build Tests Crates.io License Documentation

一个允许您对您的变体字段进行操作的库。

安装和使用

将此添加到您的 Cargo.toml 文件中

[dependencies]
custom_attrs = "1.6"

然后您可以使用 derive 属性来使用此库。

use custom_attrs::CustomAttrs;

#[derive(CustomAttrs)]
enum Enum {
    // ...
}

属性声明。

每个属性声明位于 derive 和枚举之间。

use custom_attrs::CustomAttrs;

#[derive(CustomAttrs)]

// attribute declarations 

enum Enum {
    // ...
}

默认情况下,属性声明由两部分组成:属性名称和其类型。

#[attr(name: u32)]

您可以在单个 attr 中声明多个属性声明。

#[attr(
    name: u32,
    name2: usize
)]

可选地,您可以添加更多组件。

可选组件

您可以在属性名称之前设置可见性。这将改变获取函数的可见性。

#[attr(pub attribute: u32)]

默认情况下,每个声明的属性都需要为每个变体设置一个值。如果没有设置此要求,库将产生错误。

您可以通过将其写入 Option 或在属性声明后添加默认值来使其可选,以禁用此行为。请参阅下面的示例。

可选属性语法

#[attr(attribute: Option<u32>)]
enum Enum {}

带默认值语法

#[attr(attribute: u32 = 3)]

您可以为属性声明添加文档。它将被添加到获取函数中。

#[attr(
    /// Attribute documentation
    attribute: u32
)]

设置值

要为变体设置值,只需添加属性名称,后跟您想要设置的值。

enum Enum {
    #[attr(attribute = 4)]
    VariantA
}

与声明一样,您可以一次设置多个值。

enum Enum {
    #[attr(
        attr1 = 4,
        attr2 = 1
    )]
    VariantA
}

如果属性是可选的,您不需要将其包裹在Some中。custom_attrs会为您处理这件事(仍支持将值包裹在Some中)。如果您想将值设为None,只需将它后面的值设为None即可。

#[attr(optional: Option<usize>)]
enum Enum {
    #[attr(optional = 4)]
    VariantA,

    #[attr(optional = None)]
    VariantB,

    #[attr(optional = Some(5))]
    VariantC,
}

自引用

在您设置的属性值中,您可以添加对变体字段的引用。

语法如下

#[attr(name: usize)]
enum Enum {
    // Use the name of the field if it's named
    #[attr(name = #self.field)]
    Variant {
        field: usize
    },

    // Otherwise use it's position
    #[attr(name = #self.0)]
    Variant2(usize)
}

自引用在将值解析为表达式之前进行处理,因此您可以在需要的地方使用它们。

enum Enum {
    #[attr(a = #self.list[*#self.index])]
    Variant3 {
        list: [usize; 4],
        index: usize,
    },
}

如果您使用自引用,返回的值也将是一个引用。您可以像这样解引用:

#[attr(name = *#self.<field>)]

属性配置

您可以为属性配置以更改其特性。

属性的语法如下

#[attr(
    #[<config_name> = <value>]
    <attribute>: <type>
)]

配置也可以是标志

#[attr(
    #[<config_name>]
    <attribute>: <type>
)]

像属性一样,您可以在一个块中定义多个属性,或者添加多个配置块。

#[attr(
    #[<config_name>, <config_name2> = <value>]
    <attribute>: <type>
])
#[attr(
    #[<config_name>]
    #[<config_name2> = <value>]
    <attribute>: <type>
])

以下是所有属性的列表

  • function:定义获取属性的函数的名称

获取值属性

要从变体获取值,只需调用get_<attribute name>或属性属性中设置的名称。

Element::VariantA.get_a();

此函数返回的类型在属性声明中定义。

如果您在属性上设置了文档,它将显示在这个函数上。

示例

use custom_attrs::CustomAttrs;

// ...

#[derive(CustomAttrs)]

#[attr(
    #[function = "a_getter"]
    pub a: usize
)]
#[attr(b: Option<usize>)]
#[attr(c: &'static str = "Hello world!")]
enum Enum {
    #[attr(a = 5)]
    #[attr(b = 3)]
    Variant1,

    #[attr(a = 3)]
    #[attr(c = "Hello again !")]
    Variant2,

    #[attr(
        a = 1,
        b = 5,
        c = "Hello for the last time !"
    )]
    Variant3,

    /// You can access fields of the variant
    #[attr(a = *#self.field)]
    Variant4 {
        field: usize
    }
}

fn main() {
    Enum::Variant1.a_getter(); // custom getter name
    Enum::Variant2.get_b(); // default getter name
}

有关更多详细信息,请参阅示例目录。

功能

  • help_span:合并主要错误和帮助注释,同时它们有它们自己的span,并且不会产生单独的错误。这个功能只在夜间使用。

许可证

MIT许可证下授权。

依赖项

~1.5MB
~37K SLoC