struct-field-names-as-array

Build Status Codecov Latest Version Downloads Docs License: MIT

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 * Attributes * Container Attributes * Rename all * Visibility * Field Attributes * Skip

Usage

You can derive the FieldNamesAsArray macro like this:

```rust use structfieldnamesasarray::FieldNamesAsArray;

[derive(FieldNamesAsArray)]

struct Foo { bar: String, baz: String, bat: String, }

asserteq!(Foo::FIELDNAMESASARRAY, ["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: - lowercase - UPPERCASE - PascalCase - camelCase - snake_case - SCREAMING_SNAKE_CASE - kebab-case - SCREAMING-KEBAB-CASE

```rust use structfieldnamesasarray::FieldNamesAsArray;

[derive(FieldNamesAsArray)]

[fieldnamesasarray(renameall = "SCREAMING-KEBAB-CASE")]

struct Foo { fieldone: String, fieldtwo: String, field_three: String, }

asserteq!( Foo::FIELDNAMESASARRAY, ["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:

```rust mod foo { use structfieldnamesasarray::FieldNamesAsArray;

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

}

asserteq!(foo::Foo::FIELDNAMESASARRAY, ["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.

```rust use structfieldnamesasarray::FieldNamesAsArray;

[derive(FieldNamesAsArray)]

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

asserteq!(Foo::FIELDNAMESASARRAY, ["bar", "baz"]); ```