#枚举 #newtype #

无std newtype-enum

在枚举和它们的变体类型之间进行转换的特质

1个不稳定版本

0.1.0 2020年5月11日

#1931Rust模式

Download history 1/week @ 2024-04-07 3/week @ 2024-05-05 3/week @ 2024-05-19 13/week @ 2024-06-02 19/week @ 2024-06-16 1/week @ 2024-06-23

每月307次下载

MIT/Apache

24KB
108

Crates.io API Documentation Workflow Status

newtype-enum

特质和宏用于使用newtype枚举以及在不同枚举和它们的变体之间进行转换。

newtype枚举是一种枚举,其中每个变体都封装另一个类型,封装的类型可以唯一地识别变体。

您可以使用newtype_enum属性宏来定义newtype枚举。当宏应用到枚举E时,它将为E实现Enum特质,并为所有变体类型实现Variant<E>特质。

请参阅Enum特质的示例以了解可用方法的用法。

该宏还将所有单元和结构体变体转换为生成的结构体,并用包含生成的结构体的newtype变体替换枚举变体。下面是可用的规则和选项。

变体转换

枚举的变体将按以下方式进行转换

单元变体

#[newtype_enum]
enum Test {
    Example,
}
enum Test {
    Example(Test_variants::Example),
}

mod Test_variants {
    pub(super) struct Example;
}

Newtype变体

#[newtype_enum]
enum Test {
    Example(usize),
}
enum Test {
    Example(usize),
}

结构体变体

#[newtype_enum]
enum Test {
    Example { test: usize },
}
enum Test {
    Example(Test_variants::Example),
}

mod Test_variants {
    pub(super) struct Example {
        pub(super) test: usize,
    }
}

属性参数

您可以向newtype_enum宏传递以下参数

变体模块名称

#[newtype_enum(variants = "test")]
enum Test {
    Example,
}
enum Test {
    Example(test::Example),
}

mod test {
    // <-- the name of the generated module
    pub(super) struct Example;
}

变体模块可见性

#[newtype_enum(variants = "pub(crate) test")]
enum Test {
    Example,
}
enum Test {
    Example(test::Example),
}

pub(crate) mod test {
    // <-- the visibility of the generated module
    pub(super) struct Example;
}

可见性和属性(例如 #[derive]属性)

生成的变体结构的可见性表现得好像它们是正常枚举的一部分:所有变体及其字段与枚举本身的可见性范围相同。

属性将传递到以下位置

位置 目的地
枚举 枚举和生成的变体结构
枚举变体 生成的变体结构
变体字段 生成的结构体字段
#[newtype_enum]
#[derive(Debug)]
pub(crate) enum Test {
    #[derive(Clone)]
    Example {
        test: usize,
        pub(super) test_super: usize,
        pub(self) test_self: usize,
    },
}
#[derive(Debug)]
pub(crate) enum Test {
    Example(Test_variants::Example),
}

pub(crate) mod Test_variants {
    #[derive(Debug, Clone)]
    pub(crate) struct Example {
        pub(crate) test: usize,
        pub(in super::super) test_super: usize,
        pub(super) test_self: usize,
    }
}

许可协议

许可协议为以下之一

任你选择。

贡献

除非你明确表示,否则,根据Apache-2.0许可证定义的,任何有意提交以包含在作品中的贡献,应按上述方式双重许可,不得附加任何额外条款或条件。

依赖

~2MB
~44K SLoC