#枚举 #整数 #宏推导 #无分配

无std zconvertenumn

将数字转换为枚举

3个稳定版本

1.0.2 2024年3月3日
1.0.1 2024年3月2日

1848Rust模式

每月43次下载

MIT/Apache

12KB
98 代码行

将数字转换为枚举

github crates.io docs.rs build status

此crate提供了一个衍生宏,用于生成将原始整数转换为枚举相应变体的函数。

生成的函数名为 n,具有以下签名

impl YourEnum {
    pub fn n(value: Repr) -> Option<Self>;
}

其中 Repr 是下面更详细描述的适当大小的整数类型。

示例

use enumn::N;

#[derive(PartialEq, Debug, N)]
enum Status {
    LegendaryTriumph,
    QualifiedSuccess,
    FortuitousRevival,
    IndeterminateStalemate,
    RecoverableSetback,
    DireMisadventure,
    AbjectFailure,
}

fn main() {
    let s = Status::n(1);
    assert_eq!(s, Some(Status::QualifiedSuccess));

    let s = Status::n(9);
    assert_eq!(s, None);
}

签名

生成的签名取决于枚举是否有 #[repr(..)] 属性。如果指定了 repr,则 n 的输入必须为该类型。

#[derive(enumn::N)]
#[repr(u8)]
enum E {
    /* ... */
}

// expands to:
impl E {
    pub fn n(value: u8) -> Option<Self> {
        /* ... */
    }
}

另一方面,如果没有指定 repr,则我们得到一个泛型签名,适用于多种可能的类型。

impl E {
    pub fn n<REPR: Into<i64>>(value: REPR) -> Option<Self> {
        /* ... */
    }
}

区分符

转换会明确地尊重枚举区分符。考虑这个枚举

#[derive(enumn::N)]
enum Letter {
    A = 65,
    B = 66,
}

在这里,Letter::n(65) 将返回 Some(Letter::A)


许可证

根据您的选择,许可协议为 Apache License, Version 2.0MIT许可证
除非您明确表示,否则根据Apache-2.0许可证定义,您有意提交的任何贡献都将根据上述协议双许可,不附加任何额外条款或条件。

依赖项

~255–700KB
~17K SLoC