1个不稳定版本
0.1.0 | 2023年2月7日 |
---|
#827 in 过程宏
13KB
254 行
get_fields
提供 GetFields
过程宏。该宏将 get_fields
常量添加到宏衍生的结构体中。 get_fields
包含给定结构体的字段名。
注意:该宏只能从命名结构体中派生。
目录
使用方法
您可以通过以下方式派生 GetFields
宏
use get_fields::GetFields;
#[derive(GetFields)]
struct Foo {
bar: String,
baz: String,
bat: String,
}
assert_eq!(Foo::get_fields, ["bar", "baz", "bat"]);
属性
GetFields
宏支持 get_fields
属性。 get_fields
可以应用于容器或字段,下面列出了不同的参数。
容器属性
容器属性是全局属性,它改变整个字段名数组的行为,而不是单个字段的行为。
重命名所有
rename_all
属性根据提供的命名约定重命名结构体的所有字段。此属性的工作方式与 serde 相当。支持以下命名约定
小写
大写
PascalCase
camelCase
snake_case
SCREAMING_SNAKE_CASE
kebab-case
SCREAMING-KEBAB-CASE
use get_fields::GetFields;
#[derive(GetFields)]
#[get_fields(rename_all = "SCREAMING-KEBAB-CASE")]
struct Foo {
field_one: String,
field_two: String,
field_three: String,
}
assert_eq!(
Foo::get_fields,
["FIELD-ONE", "FIELD-TWO", "FIELD-THREE"],
);
注意:与 serde 的 rename_all
实现相同,假设您的字段名遵循 Rust 命名约定,所有字段名都必须以 snake_case
提供的格式给出。如果不这样,应用 rename_all
可能会导致意外的字段名。
字段属性
可以将字段属性添加到命名结构体的字段中,并更改单个字段的行为。
跳过
skip
属性从 get_fields
中删除字段。
use get_fields::GetFields;
#[derive(GetFields)]
struct Foo {
bar: String,
baz: String,
#[get_fields(skip)]
bat: String,
}
assert_eq!(Foo::get_fields, ["bar", "baz"]);
可见性
函数 get_fields
的可见性与其对应的结构体相同。例如,如果它是 pub struct Foo { ... }
,则 get_fields
也将是公开的。例如,这将起作用
mod foo {
use get_fields::GetFields;
#[derive(GetFields)]
pub(super) struct Foo {
bar: String,
baz: String,
bat: String,
}
}
assert_eq!(foo::Foo::get_fields, ["bar", "baz", "bat"]);
而以下将不起作用,因为 get_fields
是私有的
mod foo {
use get_fields::GetFields;
#[derive(GetFields)]
struct Foo {
bar: String,
baz: String,
bat: String,
}
}
assert_eq!(foo::Foo::get_fields, ["bar", "baz", "bat"]);
依赖项
~1.5MB
~35K SLoC