#枚举 #转换 #派生 #转换 # #

into_variant

轻松将您的类型转换为对应的枚举变体

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 次下载

MIT/Apache

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!

然而,由于只有一个方法可以创建包含 SaveMessageAppMessage,我们可以自动推断枚举变体——这正是这个包的作用所在!

#[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