#sum #error-handling #anon #no-alloc #anonymous-enum

no-std anon_enum

具有完全泛型变体的枚举类型

2 个稳定版本

1.1.0 2023 年 3 月 25 日
1.0.0 2023 年 3 月 17 日

#2322Rust 模式

28 每月下载量

CC0 许可证

37KB
976

匿名枚举

具有完全泛型变体的枚举类型。

此库定义了枚举类型,其泛型参数从 2(《tt class="src-rs">Enum2》)到 16(《tt class="src-rs">Enum16》)。给定枚举类型的每个泛型参数是其相应变体(同名的单个字段)的类型(所有变体都是具有单个字段的元组结构体)。

use std::collections::HashMap;

use anon_enum::Enum2;

/// Error type stating that a map does not contain a given key.
struct ErrKeyNotFound;

/// Error type stating that an integer overflow occured during
/// an arithmetic operation.
struct ErrIntegerOverflow;

/// Maps a `str` to an integer of type `i32` and returns the integer plus one.
fn get_and_add_one(
    map: &HashMap<&str, i32>,
    key: &str,
) -> Result<i32, Enum2<ErrKeyNotFound, ErrIntegerOverflow>> {
    Ok(map
        .get(key)
        .ok_or(Enum2::T0(ErrKeyNotFound))?
        .checked_add(1)
        .ok_or(Enum2::T1(ErrIntegerOverflow))?)
}

fn main() {
    let mut fruit_count = HashMap::new();

    fruit_count.insert("Lime", 5);
    fruit_count.insert("Orange", i32::MAX);

    matches!(get_and_add_one(&fruit_count, "Lime"), Ok(6));
    matches!(
        get_and_add_one(&fruit_count, "Tangerine"),
        Err(Enum2::T0(ErrKeyNotFound))
    );
    matches!(
        get_and_add_one(&fruit_count, "Orange"),
        Err(Enum2::T1(ErrIntegerOverflow))
    );
}

可以通过将《tt class="src-rs">T15》的泛型类型设置为枚举类型来表示超过 16 个变体的枚举

// Enum of 18 variants.
Enum16<T0, T1, ..., T14, Enum3<T15, T16, T17>>

无运行时依赖