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