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 相当。支持以下命名约定
小写大写PascalCasecamelCasesnake_caseSCREAMING_SNAKE_CASEkebab-caseSCREAMING-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