#枚举 #变体 #迭代器 #过滤 #特质 #生成 #结构体

enum-filter

从迭代器中过滤到特定的枚举变体

1个不稳定版本

0.1.0 2023年7月26日

#1646过程宏

每月 39 次下载

MIT 许可证

12KB
226

enum_filter

enum_filter 提供了一个宏,该宏将为枚举迭代器生成 "filter" 方法
它通过创建一个与枚举具有相同可见性的 trait EnumNameFilter 来实现
对于具有命名字段的变体,它将创建一个与枚举具有相同可见性的 struct VariantNameData

#[enum_filter]
enum Example {
    Variant1,
    Variant2(u8),
    Variant3 { data: u8 },
}

fn main() {
    let mut test_vec = vec![
        Example::Variant1,
        Example::Variant2(2),
        Example::Variant3 { data: 3 },
    ];

    assert_eq!(
        test_vec.iter().filter_variant1().collect::<Vec<_>>(),
        vec![()]
    );

    assert_eq!(
        test_vec.iter_mut().filter_variant2().collect::<Vec<_>>(),
        vec![&mut 2]
    );

    assert_eq!(
        test_vec
            .into_iter()
            .filter_variant3()
            .map(|v| v.data)
            .collect::<Vec<_>>(),
        vec![3]
    );
}

lib.rs:

enum_filter 提供了一个宏,该宏将为枚举迭代器生成 "filter" 方法。它通过创建一个与枚举具有相同可见性的 trait EnumNameFilter 来实现,对于具有命名字段的变体,它将创建一个与枚举具有相同可见性的 struct VariantNameData

#[enum_filter]
enum Example {
    Variant1,
    Variant2(u8),
    Variant3 { data: u8 },
}
fn main() {
    let mut test_vec = vec![
        Example::Variant1,
        Example::Variant2(2),
        Example::Variant3 { data: 3 },
    ];
    assert_eq!(
        test_vec.iter().filter_variant1().collect::<Vec<_>>(),
        vec![()]
    );
    assert_eq!(
        test_vec.iter_mut().filter_variant2().collect::<Vec<_>>(),
        vec![&mut 2]
    );
    assert_eq!(
        test_vec
            .into_iter()
            .filter_variant3()
            .map(|v| v.data)
            .collect::<Vec<_>>(),
        vec![3]
    );
}

依赖项

~0.9–1.4MB
~27K SLoC