#enums #inner #deriving #access #automatic #field #accessor

enum-as-inner

为枚举生成自动访问内部成员的函数的过程宏

12个版本

0.6.0 2023年5月30日
0.5.1 2022年8月6日
0.5.0 2022年5月23日
0.4.0 2022年2月26日
0.2.1 2018年12月9日

过程宏 中排名 35

Download history 340443/week @ 2024-03-14 332907/week @ 2024-03-21 373460/week @ 2024-03-28 354174/week @ 2024-04-04 370855/week @ 2024-04-11 375261/week @ 2024-04-18 356582/week @ 2024-04-25 345906/week @ 2024-05-02 342696/week @ 2024-05-09 380496/week @ 2024-05-16 391260/week @ 2024-05-23 390075/week @ 2024-05-30 392299/week @ 2024-06-06 391665/week @ 2024-06-13 392114/week @ 2024-06-20 338841/week @ 2024-06-27

每月下载量 1,594,989
1,488 个crate(直接使用84个) 中使用

MIT/Apache

17KB
265

enum-as-inner

一个用于生成自动访问枚举内部成员的函数的deriving过程宏。

基本未命名字段案例

基本案例适用于单个元素的枚举,例如

use enum_as_inner::EnumAsInner;

#[derive(Debug, EnumAsInner)]
enum OneEnum {
    One(u32),
}

其中内部项可以通过 as_*()as_*_mut() 函数检索,或者通过 into_*() 函数

let one = OneEnum::One(1);

assert_eq!(*one.as_one().unwrap(), 1);
assert_eq!(one.into_one().unwrap(), 1);

let mut one = OneEnum::One(2);

assert_eq!(*one.as_one().unwrap(), 1);
assert_eq!(*one.as_one_mut().unwrap(), 1);
assert_eq!(one.into_one().unwrap(), 1);

结果要么是内部项的引用,要么是包含内部项的元组。

单元案例

如果枚举的变体与预期类型匹配,则返回true

use enum_as_inner::EnumAsInner;

#[derive(EnumAsInner)]
enum UnitVariants {
    Zero,
    One,
    Two,
}

let unit = UnitVariants::Two;

assert!(unit.is_two());

多个,未命名字段案例

这将返回一个内部类型的元组

use enum_as_inner::EnumAsInner;

#[derive(Debug, EnumAsInner)]
enum ManyVariants {
    One(u32),
    Two(u32, i32),
    Three(bool, u32, i64),
}

并且可以像这样访问

let mut many = ManyVariants::Three(true, 1, 2);

assert_eq!(many.as_three().unwrap(), (&true, &1_u32, &2_i64));
assert_eq!(many.as_three_mut().unwrap(), (&mut true, &mut 1_u32, &mut 2_i64));
assert_eq!(many.into_three().unwrap(), (true, 1_u32, 2_i64));

多个,命名字段案例

这将返回与未命名选项相同的内部类型的元组

use enum_as_inner::EnumAsInner;

#[derive(Debug, EnumAsInner)]
enum ManyVariants {
    One{ one: u32 },
    Two{ one: u32, two: i32 },
    Three{ one: bool, two: u32, three: i64 },
}

并且可以像这样访问

let mut many = ManyVariants::Three{ one: true, two: 1, three: 2 };

assert_eq!(many.as_three().unwrap(), (&true, &1_u32, &2_i64));
assert_eq!(many.as_three_mut().unwrap(), (&mut true, &mut 1_u32, &mut 2_i64));
assert_eq!(many.into_three().unwrap(), (true, 1_u32, 2_i64));

依赖项

~300–750KB
~18K SLoC