1 个不稳定版本
0.2.0 | 2023 年 12 月 29 日 |
---|---|
0.1.1 |
|
0.1.0 |
|
#2418 在 Rust 模式
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]
。