Skip to content

Procedural macro that generates an array of the field names of a named struct

License

Notifications You must be signed in to change notification settings

jofas/struct_field_names_as_array

Repository files navigation

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"]);

Rename

The rename attribute renames the field in the generated constant.

use struct_field_names_as_array::FieldNamesAsArray;

#[derive(FieldNamesAsArray)]
struct Foo {
    bar: String,
    baz: String,
    #[field_names_as_array(rename = "foo")]
    bat: String,
}

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

About

Procedural macro that generates an array of the field names of a named struct

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages