#field-name #struct-fields #proc-macro #macro #attributes #array #procedural

macro struct-field-names-as-array-derive

Procedural macros for the struct-field-names-as-array crate

1 unstable release

0.3.0 Oct 10, 2023

#47 in #field-name

Download history 577/week @ 2024-07-21 898/week @ 2024-07-28 1096/week @ 2024-08-04 760/week @ 2024-08-11 892/week @ 2024-08-18 1168/week @ 2024-08-25 795/week @ 2024-09-01 940/week @ 2024-09-08 912/week @ 2024-09-15 1239/week @ 2024-09-22 2059/week @ 2024-09-29 2400/week @ 2024-10-06 1419/week @ 2024-10-13 1793/week @ 2024-10-20 1422/week @ 2024-10-27 1583/week @ 2024-11-03

6,273 downloads per month
Used in struct-field-names-as-arr…

MIT license

15KB
240 lines

struct-field-names-as-array

Build Status Codecov Latest Version Downloads Docs License: MIT

Provides the FieldNamesAsArray and FieldNamesAsSlice traits and procedural macros for deriving them. The traits contain associated constants (FieldNamesAsArray::FIELD_NAMES_AS_ARRAY and FieldNamesAsSlice::FIELD_NAMES_AS_SLICE) listing the field names of a struct.

Note: The macros can only be derived from named structs.

Table of Contents

Usage

You can derive the FieldNamesAsArray and FieldNamesAsSlice macros like this:

use struct_field_names_as_array::FieldNamesAsArray;

#[derive(FieldNamesAsArray)]
struct Foo {
    bar: String,
    baz: String,
    bat: String,
}

assert_eq!(Foo::FIELD_NAMES_AS_ARRAY, ["bar", "baz", "bat"]);
use struct_field_names_as_array::FieldNamesAsSlice;

#[derive(FieldNamesAsSlice)]
struct Foo {
    bar: String,
    baz: String,
    bat: String,
}

assert_eq!(Foo::FIELD_NAMES_AS_SLICE, ["bar", "baz", "bat"]);

Attributes

The FieldNamesAsArray macro comes with the field_names_as_array attribute. Orthogonally, FieldNamesAsSlice supports the field_names_as_slice attribute with the same arguments. The arguments are listed below.

Container Attributes

Container attributes are global attributes that change the behavior of the whole field names collection, rather than that of a single field.

Rename all

The rename_all attribute renames every field of the struct according to the provided naming convention. This attribute works exactly like the serde equivalent. Supported are these naming conventions:

  • lowercase
  • UPPERCASE
  • PascalCase
  • camelCase
  • snake_case
  • SCREAMING_SNAKE_CASE
  • kebab-case
  • SCREAMING-KEBAB-CASE
use struct_field_names_as_array::FieldNamesAsArray;

#[derive(FieldNamesAsArray)]
#[field_names_as_array(rename_all = "SCREAMING-KEBAB-CASE")]
struct Foo {
    field_one: String,
    field_two: String,
    field_three: String,
}

assert_eq!(
  Foo::FIELD_NAMES_AS_ARRAY, 
  ["FIELD-ONE", "FIELD-TWO", "FIELD-THREE"],
);

Note: Same as serde's implementation of rename_all, it is assumed that your field names follow the rust naming convention. Namely, all field names must be given in snake_case. If you don't follow this convention, applying rename_all may result in unexpected field names.

Field Attributes

Field attributes can be added to the fields of a named struct and change the behavior of a single field.

Skip

The skip attribute removes the field from the generated constant.

use struct_field_names_as_array::FieldNamesAsSlice;

#[derive(FieldNamesAsSlice)]
struct Foo {
    bar: String,
    baz: String,
    #[field_names_as_slice(skip)]
    bat: String,
}

assert_eq!(Foo::FIELD_NAMES_AS_SLICE, ["bar", "baz"]);

Dependencies

~230–680KB
~16K SLoC