# 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 Apache License, Version
2.0 or MIT license at your option.
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.