enum-fields 0.2.0

Quickly access shared enum fields in Rust.
Documentation
# enum-fields

  [![Build Status]][actions] [![Latest Version]][crates.io]

[Build Status]: https://img.shields.io/github/actions/workflow/status/usadson/enum-fields/rust.yml?branch=main
[actions]: https://github.com/usadson/enum-fields/actions?query=branch%3Amain
[Latest Version]: https://img.shields.io/crates/v/enum-fields.svg
[crates.io]: https://crates.io/crates/enum-fields

Quickly access shared enum fields in Rust.

## Installation

Add the `enum-fields` crate to your `Cargo.toml` file:
```toml
[dependencies]
enum-fields = "*"
```

Let your `enum` derive from `enum_fields::EnumFields` like this:
```rs
#[derive(enum_fields::EnumFields)]

pub enum MyEnum {
    ...
}
```

## Usage

The following example showcases an enum `Entity`, which contains two
variants: `Company` and `Person`.

```rs
/// An entity that can be either a `Company` or a `Person`.
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, enum_fields::EnumFields)]

pub enum Entity {
    Company {
        name: String,
        ceo: String,
    },

    Person {
        name: String,
    }
}
```

Since `Entity` derives from [`enum_fields::EnumFields`], it now contains
two field accessor functions (getters): `Entity::name()` and
`Entity::ceo()`.

```rs
let company = Entity::Company {
    name: "Apple".into(),
    ceo: "Tim Cook".into()
};

let person = Entity::Person {
    name: "Tim Berners-Lee".into()
};

println!("Company with CEO: {} named: {}",
    company.ceo().unwrap(),
    company.name()
);

println!("Person named: {}", person.name());
```

Note that both `Company` and `Person` have a field named `name`. This
enforces `enum-fields` to let `Entity::name()` return the type directly.

```rs
// Since [`Entity`] has two variants that both have the `name` field,
// `Entity::name(&self)` returns the `&String`.
assert_eq!(company.name(), "Apple");
assert_eq!(person.name(), "Tim Berners-Lee");
```

However, only `Company` has field `ceo`, which therefore makes
`Entity::ceo()` return an optional getter: `Option<&String>`.

```rs
// Only `Company` has field `ceo`, so it returns an `Option<&String>`,
// since a `Person` returns [`None`].
assert_eq!(company.ceo(), Some(&"Tim Cook".into()));
assert_eq!(person.ceo(), None);
```

## License

Licensed under either <a href="LICENSE-APACHE">Apache License, Version
2.0</a> or <a href="LICENSE-MIT">MIT license</a> at your option.

<br>

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in EnumFields by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.