Expand description
struct-field-names-as-array
Provides the FieldNamesAsArray procedural macro.
The macro adds the FIELD_NAMES_AS_ARRAY constant to the struct the
macro is dervied on.
The FIELD_NAMES_AS_ARRAY contains the field names of the given
struct.
Note: The macro can only be derived from named structs.
Table of Contents
Usage
You can derive the FieldNamesAsArray macro 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"]);Attributes
The FieldNamesAsArray macro supports the
field_names_as_array attribute.
field_names_as_array can be applied to the container or to a field
with different arguments listed below.
Container Attributes
Container attributes are global attributes that change the behavior of the whole field names array, 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:
lowercaseUPPERCASEPascalCasecamelCasesnake_caseSCREAMING_SNAKE_CASEkebab-caseSCREAMING-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.
Visibility
Per default, FIELD_NAMES_AS_ARRAY is a private member of the struct.
If you want to change the visibility of FIELD_NAMES_AS_ARRAY, you can use the
visibility attribute, providing it with a valid
visibility:
mod foo {
use struct_field_names_as_array::FieldNamesAsArray;
#[derive(FieldNamesAsArray)]
#[field_names_as_array(visibility = "pub(super)")]
pub(super) struct Foo {
bar: String,
baz: String,
bat: String,
}
}
assert_eq!(foo::Foo::FIELD_NAMES_AS_ARRAY, ["bar", "baz", "bat"]);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 FIELD_NAMES_AS_ARRAY.
use struct_field_names_as_array::FieldNamesAsArray;
#[derive(FieldNamesAsArray)]
struct Foo {
bar: String,
baz: String,
#[field_names_as_array(skip)]
bat: String,
}
assert_eq!(Foo::FIELD_NAMES_AS_ARRAY, ["bar", "baz"]);Derive Macros
- Adds the
FIELD_NAMES_AS_ARRAYconstant to the deriving struct.