10个稳定版本
1.6.2 | 2023年3月26日 |
---|---|
1.6.0 | 2023年3月9日 |
1.5.3 | 2023年2月25日 |
284 在 进程宏 中
每月30次下载
59KB
1K SLoC
Custom Attrs
一个允许您对您的变体字段进行操作的库。
安装和使用
将此添加到您的 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