#field-name #proc-macro #macro #struct #attributes #named #procedural

get_fields

提供一种过程宏,用于生成命名结构体字段名的数组

1个不稳定版本

0.1.0 2023年2月7日

#827 in 过程宏

MIT/Apache

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