# struct-field-names-as-array [![Build Status](https://github.com/jofas/struct_field_names_as_array/actions/workflows/build.yml/badge.svg)](https://github.com/jofas/struct_field_names_as_array/actions/workflows/build.yml) [![Codecov](https://codecov.io/gh/jofas/struct_field_names_as_array/branch/master/graph/badge.svg?token=69YKZ1JIBK)](https://codecov.io/gh/jofas/struct_field_names_as_array) [![Latest Version](https://img.shields.io/crates/v/struct-field-names-as-array.svg)](https://crates.io/crates/struct-field-names-as-array) [![Downloads](https://img.shields.io/crates/d/struct-field-names-as-array?label=downloads)](https://crates.io/crates/struct-field-names-as-array) [![Docs](https://img.shields.io/badge/docs-latest-blue.svg)](https://docs.rs/struct-field-names-as-array/latest/struct_field_names_as_array) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/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](#usage) * [Attributes](#attributes) * [Container Attributes](#container-attributes) * [Rename all](#rename-all) * [Field Attributes](#field-attributes) * [Skip](#skip) ## Usage You can derive the `FieldNamesAsArray` and `FieldNamesAsSlice` macros like this: ```rust 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"]); ``` ```rust 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][serde_rename_all] equivalent. Supported are these naming conventions: - `lowercase` - `UPPERCASE` - `PascalCase` - `camelCase` - `snake_case` - `SCREAMING_SNAKE_CASE` - `kebab-case` - `SCREAMING-KEBAB-CASE` ```rust 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. ```rust 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"]); ``` [serde_rename_all]: https://serde.rs/container-attrs.html#rename_all