#macro-derive #enums #attributes #macro #derive #proc-macro

nightly macro no-std auto_enums

一个通过自动生成枚举允许多种返回类型的库

55 个版本

新增 0.8.6 2024 年 8 月 23 日
0.8.5 2024 年 1 月 27 日
0.8.3 2023 年 10 月 21 日
0.8.1 2023 年 6 月 29 日
0.3.2 2018 年 12 月 27 日

#261 in Rust 模式

Download history 33079/week @ 2024-05-03 33338/week @ 2024-05-10 32388/week @ 2024-05-17 30543/week @ 2024-05-24 30820/week @ 2024-05-31 40749/week @ 2024-06-07 44894/week @ 2024-06-14 45888/week @ 2024-06-21 40367/week @ 2024-06-28 34990/week @ 2024-07-05 33423/week @ 2024-07-12 36338/week @ 2024-07-19 39563/week @ 2024-07-26 36067/week @ 2024-08-02 41944/week @ 2024-08-09 41673/week @ 2024-08-16

166,970 每月下载量
用于 109 个crate (16 个直接使用)

Apache-2.0 OR MIT

185KB
3.5K SLoC

auto_enums

crates.io docs.rs license msrv github actions

一个通过自动生成枚举允许多种返回类型的库。

此crate是rust-lang/rfcs#2414中讨论的功能的过程宏实现。这个想法也被称为“匿名求和类型”。

此库提供以下属性宏

  • #[auto_enum]

    解析语法,创建枚举,插入变体,并将指定的特质传递给#[enum_derive]

  • #[enum_derive]

    为枚举实现指定的特质。

用法

将以下内容添加到您的Cargo.toml

[dependencies]
auto_enums = "0.8"

示例

#[auto_enum]的基本功能是使用实现了指定特质的枚举包裹显式分支(例如 matchifreturn 等)返回的值。

use auto_enums::auto_enum;

#[auto_enum(Iterator)]
fn foo(x: i32) -> impl Iterator<Item = i32> {
    match x {
        0 => 1..10,
        _ => vec![5, 10].into_iter(),
    }
}

#[auto_enum]在两个阶段生成代码。

首先,#[auto_enum]将执行以下操作。

  • 解析语法
  • 创建枚举
  • 插入变体

将生成如下代码

fn foo(x: i32) -> impl Iterator<Item = i32> {
    #[::auto_enums::enum_derive(Iterator)]
    enum __Enum1<__T1, __T2> {
        __T1(__T1),
        __T2(__T2),
    }

    match x {
        0 => __Enum1::__T1(1..10),
        _ => __Enum1::__T2(vec![5, 10].into_iter()),
    }
}

其次,#[enum_derive]实现指定的特质。

将生成如下代码

#[auto_enum] 也可以通过使用 #[nested] 属性来解析嵌套的 arms/branches。

use auto_enums::auto_enum;

#[auto_enum(Iterator)]
fn foo(x: i32) -> impl Iterator<Item = i32> {
    match x {
        0 => 1..10,
        #[nested]
        _ => match x {
            1 => vec![5, 10].into_iter(),
            _ => 0..=x,
        },
    }
}

有关更多详细信息,请参阅 文档

支持的特质

#[enum_derive] 实现了支持的特质,并将不支持的特征传递给 #[derive]

#[enum_derive] 支持许多标准库特质以及一些流行的第三方库特质,如 rayonfuturestokiohttp_body。有关支持的特质完整列表,请参阅 文档

如果您想使用 #[enum_derive] 不支持的特质,您可以使用提供 派生宏 的另一个 crate,或者您可以自己定义派生宏 (derive_utils 可能会提供帮助)。

#[enum_derive] 的基本用法

use auto_enums::enum_derive;

// `#[enum_derive]` implements `Iterator`, and `#[derive]` implements `Clone`.
#[enum_derive(Iterator, Clone)]
enum Foo<A, B> {
    A(A),
    B(B),
}

可选功能

  • std (默认启用)
    • 启用使用 std 库的特质。
  • ops
    • 启用使用 [std|core]::ops's DerefDerefMutIndexIndexMutRangeBounds 特质。
  • convert
    • 启用使用 [std|core]::convert's AsRefAsMut 特质。
  • fmt
    • 启用使用 [std|core]::fmt 除了 DebugDisplayWrite 之外的特质。
  • transpose_methods
    • 启用使用 transpose* 方法。
  • futures03
  • futures01
  • rayon
    • 启用使用 rayon 特质。
  • serde
    • 启用使用 serde 特质。
  • tokio1
  • tokio03
  • tokio02
  • tokio01
  • http_body1
  • coroutine_trait
    • 启用使用 [std|core]::ops::Coroutine 特性。
    • 请注意,此功能是不稳定的,可能会导致补丁版本之间的不兼容性变化。
  • fn_traits
    • 启用使用 [std|core]::opsFnFnMutFnOnce 特性。
    • 请注意,此功能是不稳定的,可能会导致补丁版本之间的不兼容性变化。
  • trusted_len
    • 启用使用 [std|core]::iter::TrustedLen 特性。
    • 请注意,此功能是不稳定的,可能会导致补丁版本之间的不兼容性变化。

type_analysis 功能

分析函数和 let 绑定的返回类型。

请注意,此功能仍然是实验性的。

示例

use auto_enums::auto_enum;

#[auto_enum] // there is no need to specify std library's traits
fn func1(x: i32) -> impl Iterator<Item = i32> {
    match x {
        0 => 1..10,
        _ => vec![5, 10].into_iter(),
    }
}

#[auto_enum]
fn func2(x: i32) {
    // Unlike `feature(impl_trait_in_bindings)`, this works on stable compilers.
    #[auto_enum]
    let iter: impl Iterator<Item = i32> = match x {
        0 => Some(0).into_iter(),
        _ => 0..x,
    };
}

如果您返回具有相同名称的其他特性,请小心。

  • derive_utils:一个用于轻松编写枚举 derives 宏 的过程宏助手。
  • io-enum:为枚举提供 #[derive(Read, Write, Seek, BufRead)]。
  • iter-enum:为枚举提供 #[derive(Iterator, DoubleEndedIterator, ExactSizeIterator, Extend)]。

许可证

根据您的选择,在 Apache 许可证,版本 2.0MIT 许可证 下许可。

除非您明确声明,否则根据 Apache-2.0 许可证定义的任何有意提交以包含在作品中并由您提交的贡献,应如上所述双重许可,不附加任何其他条款或条件。

依赖项

~310–760KB
~18K SLoC