alias_either

Macro alias_either 

Source
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}"#);