struct-field-names-as-array 0.3.0

Crate for generating the field names of named structs as constants
Documentation
# 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

<!--ts-->
   * [Usage]#usage
   * [Attributes]#attributes
      * [Container Attributes]#container-attributes
         * [Rename all]#rename-all
      * [Field Attributes]#field-attributes
         * [Skip]#skip
<!--te-->

## 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