4 个版本 (2 个重大变更)
0.3.0 | 2022 年 5 月 14 日 |
---|---|
0.2.0 | 2022 年 4 月 7 日 |
0.1.1 | 2022 年 4 月 6 日 |
0.1.0 | 2022 年 4 月 6 日 |
#2689 in Rust 模式
每月 38 次下载
10KB
99 行
into_variant
轻松将您的类型转换为对应的枚举变体。
用法
在 Rust 中,您可能会有具有单个字段的枚举变体——这些枚举使您能够区分不同类型的值。例如,您可能会有一个可能的 app 消息层次结构
use into_variant::VariantFrom;
#[derive(VariantFrom)]
enum AppMessage {
File(FileMessage),
Editor(EditorMessage),
}
#[derive(VariantFrom)]
enum FileMessage {
Save(SaveMessage),
Close(CloseMessage),
}
#[derive(VariantFrom)]
enum EditorMessage {
Insert(InsertMessage),
Formatting(FormattingMessage),
}
struct SaveMessage {}
struct CloseMessage {}
struct InsertMessage {}
通常,如果您想构建这些消息之一,您必须输入一个长长的嵌套枚举链
AppMessage::File(FileMessage::Save(SaveMessage {}))
// ^^^^^^^^^^^^^^^^^^^^^^^^ this bit is redundant, let's infer it automatically!
然而,由于只有一个方法可以创建包含 SaveMessage
的 AppMessage
,我们可以自动推断枚举变体——这正是这个包的作用所在!
#[test]
fn test_variant_from() {
assert!(matches!(
AppMessage::variant_from(SaveMessage {}),
AppMessage::File(FileMessage::Save(SaveMessage {}))
));
assert!(matches!(
AppMessage::variant_from(InsertMessage {}),
AppMessage::Editor(EditorMessage::Insert(InsertMessage {}))
));
}
您还可以获得 into_variant
,如果可以推断出 AppMessage
,则会更短——例如,在函数调用中
#[test]
fn test_into_variant() {
function_that_takes_app_message(SaveMessage {}.into_variant())
}
fn function_that_takes_app_message(_message: AppMessage) {}
适用于任意深度嵌套的枚举!
#[derive(VariantFrom)]
enum FormattingMessage {
ClearFormatting(ClearFormattingMessage),
}
struct ClearFormattingMessage {}
#[test]
fn test_deeper_nesting() {
assert!(matches!(
AppMessage::variant_from(ClearFormattingMessage {}),
AppMessage::Editor(EditorMessage::Formatting(
FormattingMessage::ClearFormatting(ClearFormattingMessage {})
))
))
}
您可以在 tests/app_message.rs
中找到完整的示例以及其他示例。
项目状态
我需要这个用于某事,所以它可能会被维护一段时间。欢迎提出建议,但我不能保证我会处理它们。
依赖项
~1.5MB
~35K SLoC