enum-utility-macros 0.1.0

A macro to generate useful helpers for enums
Documentation
#![allow(dead_code)]

use enum_utility_macros::generate_enum_helper;

#[generate_enum_helper(
    TagEnum, RefEnum, MutEnum, is, unwrap, get, to_tag, unwrap_ref, unwrap_mut, as_ref, as_mut,
    get_mut
)]
enum MyEnum {
    Int32 { int: i32 },
    Float { float: f32 },
    Double { double: f64 },
}

#[test]
fn test_tag_enum() {
    let mut v1 = MyEnum::Int32 { int: 0 };
    let mut v2 = MyEnum::Float { float: 0.0 };
    let mut v3 = MyEnum::Double { double: 0.0 };

    let t1 = MyEnumTag::Int32;
    let t2 = MyEnumTag::Float;
    let t3 = MyEnumTag::Double;

    assert_eq!(t1, v1.to_tag());
    assert_eq!(t2, v2.to_tag());
    assert_eq!(t3, v3.to_tag());

    let _r1 = MyEnumRef::Int32 { int: &0 };
    let _r2 = MyEnumRef::Float { float: &0.0 };
    let _r3 = MyEnumRef::Double { double: &0.0 };

    let mut m1 = MyEnumMut::Int32 { int: &mut 0 };
    let _m2 = MyEnumMut::Float { float: &mut 0.0 };
    let _m3 = MyEnumMut::Double { double: &mut 0.0 };

    let _: &mut i32 = m1.unwrap_int32();

    assert!(v1.is_int32());
    assert!(!v1.is_double());
    assert!(!v1.is_float());

    let _: &i32 = v1.unwrap_ref_int32();
    let _: &f32 = v2.unwrap_ref_float();
    let _: &f64 = v3.unwrap_ref_double();

    let _: &mut i32 = v1.as_mut().get_int32().unwrap();
    let _: &mut f32 = v2.as_mut().get_float().unwrap();
    let _: &mut f64 = v3.as_mut().get_double().unwrap();
}