Crate enum_fields

source ·
Expand description


Quickly access shared enum fields in Rust.


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

/// 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,

Field Accessor Functions (Getters)

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

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: {}",,

println!("Person named: {}",;

Shared Fields

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

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

Shared Fields (Optional)

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

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

Derive Macros