#enums #accessor #proc-macro #macro #generate

macro enum_access

Custom derive for automatically generating the accessor methods for Enums

10 releases

Uses old Rust 2015

0.4.0 Jan 22, 2020
0.3.2 Aug 17, 2019
0.3.1 Dec 22, 2018
0.2.0 Nov 9, 2018
0.1.2 Aug 30, 2018

#462 in Procedural macros

Download history 3851/week @ 2023-11-27 3540/week @ 2023-12-04 2804/week @ 2023-12-11 4905/week @ 2023-12-18 1646/week @ 2023-12-25 3105/week @ 2024-01-01 3395/week @ 2024-01-08 5249/week @ 2024-01-15 4443/week @ 2024-01-22 3777/week @ 2024-01-29 2886/week @ 2024-02-05 4823/week @ 2024-02-12 4391/week @ 2024-02-19 5189/week @ 2024-02-26 3451/week @ 2024-03-04 2798/week @ 2024-03-11

15,983 downloads per month

MIT/Apache

26KB
527 lines

Build Status

EnumAccess

Custom derive for automatically generating the accessor methods for Enums.

#[macro_use]
extern crate enum_access;

#[derive(Clone, PartialEq, Debug, EnumAccess, EnumDisplay)]
#[enum_access(get(name), get_some(index, value), iter(inputs))]
enum Enum<T> {
    #[enum_display("Variant1 name:{}, input:{}", input, gen)]
    Variant1 {
        name: String,
        #[enum_alias(inputs)]
        input: i32,
        gen: T,
    },
    #[enum_inner_struct]
    Variant2 {
        index: u32,
        name: String,
        value: i32,
    },
    #[enum_inner_struct]
    Variant3 {
        name: String,
        #[enum_alias(inputs, value)]
        lhs: i32,
        #[enum_alias(inputs)]
        rhs: i32,
        #[enum_ignore]
        input: i32,
    },
    #[enum_display("Variant4 index:{}, name:{}", 0, 3)]
    Variant4(
        #[enum_alias(index)] u32,
        #[enum_alias(inputs)] i32,
        #[enum_alias(inputs)] i32,
        #[enum_alias(name)] String,
    ),
}

#[test]
fn it_works() {
    let mut v: Enum<u32> = Enum::Variant1 {
        name: "var1".to_string(),
        input: 9,
        gen: 0,
    };

    assert_eq!(v.name(), &"var1".to_string());
    assert_eq!(v.index(), None);
    assert_eq!(v.value(), None);
    assert_eq!(v.inputs(), vec![&9]);

    assert_eq!(v.to_string(), "Variant1 name:9, input:0");

    *v.name_mut() = "var1'".to_string();
    assert_eq!(v.name(), &"var1'".to_string());

    let mut v: Enum<u32> = Enum::Variant2 {
        index: 0,
        name: "var2".to_string(),
        value: 23,
    };

    let variant2: EnumVariant2Inner = v.clone().into();
    assert_eq!(v, Enum::from(variant2));

    assert_eq!(v.name(), &"var2".to_string());
    assert_eq!(v.index(), Some(&0));
    assert_eq!(v.value(), Some(&23));
    assert_eq!(v.inputs(), Vec::<&i32>::new());

    assert_eq!(v.to_string(), "");

    *v.index_mut().unwrap() = 100;
    assert_eq!(v.index(), Some(&100));

    let mut v: Enum<u32> = Enum::Variant3 {
        name: "var3".to_string(),
        lhs: 1,
        rhs: 2,
        input: 3,
    };

    let variant3: EnumVariant3Inner = v.clone().into();
    assert_eq!(v, Enum::from(variant3));

    assert_eq!(v.name(), &"var3".to_string());
    assert_eq!(v.index(), None);
    assert_eq!(v.value(), Some(&1));
    assert_eq!(v.inputs(), vec![&1, &2]);

    for n in v.inputs_mut() {
        *n += 10;
    }
    assert_eq!(v.inputs(), vec![&11, &12]);

    let v: Enum<u32> = Enum::Variant4(10u32, 11i32, 12i32, "var4".to_string());
    assert_eq!(v.name(), &"var4".to_string());
    assert_eq!(v.index(), Some(&10));
    assert_eq!(v.value(), None);
    assert_eq!(v.inputs(), vec![&11, &12]);

    assert_eq!(v.to_string(), "Variant4 index:10, name:var4");
}

Dependencies

~1.5MB
~37K SLoC