Crate enum_fields
source ·Expand description
enum-fields
Quickly access shared enum fields in Rust.
Example
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: {}",
company.ceo().unwrap(),
company.name()
);
println!("Person named: {}", person.name());
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!(company.name(), "Apple");
assert_eq!(person.name(), "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!(company.ceo(), Some(&"Tim Cook".into()));
assert_eq!(person.ceo(), None);