2 releases

0.1.1 Jan 30, 2019
0.1.0 Jan 30, 2019

#8 in #variations


Used in 2 crates (via dasn1-notation)

MIT/Apache

10KB
143 lines

Variation

A procedural macro to generate enum to variant conversion methods.

Methods generated

is_* methods

An is_variant method is generated for each for variant in an enum.

use variation::Variation;

#[derive(Variation)]
enum Type {
    Unit,
    Integer(i32),
}

fn main() {
    let return_type = Type::Unit;

    assert!(return_type.is_unit());
    assert!(!return_type.is_integer());
}

as_* & as_*_mut methods

Variants that have one or more inner types have as and as_mut allowing you to get a immutable or mutable reference to the inner types. Variants with a single inner type will return &{mut} T. Variants that have more than one inner type will return a tuple with a reference to each type.

use variation::Variation;

#[derive(Variation)]
enum Type {
    Unit,
    Integer(i32),
    Real(i32, u32),
}

fn main() {
    let mut return_type = Type::Integer(5);
    let real_value = Type::Real(3, 14);

    assert_eq!(Some(&mut 5), return_type.as_integer_mut());
    assert_eq!(Some((&3, &14)), real_value.as_real());
    assert_eq!(None, real_value.as_integer());
}

into_* methods

Variants that have one or more inner types have an into method, allowing you to attempt to convert a enum into its inner values. This method will panic when called on a variant that does not match the method.

use variation::Variation;

#[derive(Variation)]
enum Type {
    Unit,
    Integer(i32),
    Real(i32, u32),
}

fn main() {
    let mut return_type = Type::Integer(5);
    let real_value = Type::Real(3, 14);
    let unit = Type::Unit;

    assert_eq!(5, return_type.into_integer());
    assert_eq!((3, 14), real_value.into_real());
    // Panics
    unit.into_integer();

}

Dependencies

~2.5MB
~53K SLoC