macro_rules! alias_either {
($type_name:ident, $left_variant:ident, $right_variant:ident) => { ... };
($type_name:ident, $left_variant:ident, $right_variant:ident, traits: [$($trait:path),*]) => { ... };
($type_name:ident, $left_variant:ident, $right_variant:ident, [$($trait:path),*]) => { ... };
}Expand description
Creates an Either-like enum with custom variant names.
See examples::EitherExample for a generated example.
§Example
use enumizer::alias_either;
alias_either!(Choice, Primary, Secondary);
let primary: Choice<i32, String> = Choice::Primary(42);
let secondary: Choice<i32, String> = Choice::Secondary("text".to_string());
assert!(primary.is_primary());
assert!(secondary.is_secondary());
assert_eq!(primary.as_primary(), Some(&42));§Generated Methods
use enumizer::alias_either;
alias_either!(Choice, Primary, Secondary);
let mut val: Choice<i32, String> = Choice::Primary(10);
assert!(val.is_primary());
assert_eq!(val.as_primary(), Some(&10));
assert_eq!(val.as_secondary(), None);
let doubled = val.map_primary(|x| x * 2);
assert_eq!(doubled.as_primary(), Some(&20));§Custom Traits
You can specify custom traits to derive instead of the default set.
Use the traits: keyword followed by a list of trait names in brackets.
use enumizer::alias_either;
alias_either!(CustomEither, Left, Right, traits: [Debug, Clone, serde::Serialize, serde::Deserialize]);
let val: CustomEither<i32, String> = CustomEither::Left(42);
assert_eq!(format!("{:?}", val), "Left(42)");
assert_eq!(val.clone().unwrap_left(), 42);
let json = serde_json::to_string(&val).unwrap();
assert_eq!(json, r#"{"Left":42}"#);