#variant-name #enums #variant #name #macro

无需 std variante

静态验证的枚举变体名称作为字符串

1 个不稳定版本

0.2.0 2023 年 12 月 29 日
0.1.1 2023 年 12 月 29 日
0.1.0 2023 年 12 月 29 日

#2418Rust 模式

MIT/Apache

7KB

variante

静态验证的 enum 变体名称作为字符串。

此仓库受到 field 的启发。

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

安装

将以下内容添加到您的 Cargo 清单(Cargo.toml 文件)中

[dependencies]
variante = "0.2.0"

或者,只需运行 cargo add variante

依赖项

variante 无任何依赖项,并且默认与 #[no_std] 兼容。

许可协议

根据您的选择,受以下任何一个许可协议的许可

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,任何有意提交以包含在作品中的贡献,均将按上述方式双重许可,而无需任何附加条款或条件。


lib.rs:

静态验证的 enum 变体名称作为字符串。

variant! 宏在验证指定的 enum 中存在变体之后,会计算出变体的名称。类型必须在作用域内,并且变体必须在宏调用点可见(可访问)。

用法

按照 variant!(Variant @ Enum) 调用宏

use variante::*;

enum Enum {
    Foo,
    Bar(u8),
    Baz { x: i32 },
}

let foo = variant!(Foo @ Enum);
assert_eq!(foo, "Foo");

let bar = variant!(Bar @ Enum);
assert_eq!(bar, "Bar");

let baz = variant!(Baz @ Enum);
assert_eq!(baz, "Baz")

不在指定的 enum 上或不在作用域内的类型将导致编译错误

// This fails because there is no variant named "Hoge" on "Enum"
let hoge = variant!(Hoge @ Enum);

// This fails because their is no enum named "NonExistent"
let foo = variant!(Foo @ NonExistent);

泛型

variant! 也与泛型类型一起工作,只要提供具体的类型参数

use variante::*;

enum GenericEnum<T, U> {
    Foo(T),
    Bar(U),
}

let foo = variant!(Foo @ GenericEnum<(), ()>);
assert_eq!(foo, "Foo");

// Any type can be used for the type parameter(s)
let bar = variant!(Bar @ GenericEnum<i32, i64>);
assert_eq!(bar, "Bar");

路径

没错,variant! 也与路径语法一起工作

use variante::*;

mod fuga {
    pub enum Enum<T> {
        Foo(T), // Must be pub so that it is visible at the point of invocation
    }
}

let foo = variant!(Foo @ fuga::Enum<()>);
assert_eq!(foo, "Foo");

依赖项

这个crate完全无依赖。默认支持#[no_std]

无运行时依赖