1个不稳定版本
0.1.0 | 2020年5月11日 |
---|
#1931 在 Rust模式
每月307次下载
24KB
108 行
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 License,版本2.0,(LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- 麻省理工学院许可证(《LICENSE-MIT》或https://opensource.org/licenses/MIT)
任你选择。
贡献
除非你明确表示,否则,根据Apache-2.0许可证定义的,任何有意提交以包含在作品中的贡献,应按上述方式双重许可,不得附加任何额外条款或条件。
依赖
~2MB
~44K SLoC