6个版本 (稳定)
1.1.2 | 2024年3月12日 |
---|---|
1.1.1 | 2023年9月19日 |
1.0.1 | 2023年2月26日 |
1.0.0 | 2023年2月21日 |
0.1.0 | 2023年2月13日 |
#153 in 进程宏
每月4,389次下载
35KB
695 行
subenum
Subenum是一个简单的进程宏,用于派生子集枚举。它允许在父枚举和子枚举之间进行转换,并将派生到父枚举上的任何特质派生到子枚举上,如果您在父枚举上派生它,则将在父枚举和子枚举之间实现 PartialEq
。
简单示例
我认为用例子来说明它是最简单的方法
use subenum::subenum;
#[subenum(Edible)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Plant {
#[subenum(Edible)]
Basil,
#[subenum(Edible)]
Tomato,
Manzanita,
Pine,
}
fn main() -> Result<(), EdibleConvertError> {
let plant = Plant::Tomato;
// We can convert between them.
let edible = Edible::try_from(plant)?;
let _plant2 = Plant::from(edible);
// We can compare them.
assert_eq!(plant, edible);
// We derive anything that's derived on the parent, such as clone.
let edible2 = edible.clone();
Ok(())
}
复杂示例
除了简单的枚举和内置特质外,subenum
还可以与复杂枚举和第三方属性一起使用。
use subenum::subenum;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum AppleType {
CosmicCrisp,
Fuji,
PinkLady,
}
#[subenum(Foo, Tree, Edible, Grass)]
#[derive(Debug, Clone, Copy, PartialEq, strum::Display)]
pub enum Plant<'a, T> {
#[subenum(Foo)]
#[strum(serialize = "This is not a plant!")]
Foo { x: i32, y: i32 },
#[subenum(Tree, Edible)]
Apple(AppleType),
#[subenum(Grass)]
Bamboo(&'a str),
#[subenum(Edible)]
Basil(T),
#[subenum(Tree)]
Fir,
#[subenum(Tree)]
Pine,
#[subenum(Edible)]
Tomato,
#[subenum(Edible, Grass)]
Wheat,
}
fn main() -> Result<(), TreeConvertError> {
let plant: Plant<'_, u32> = Plant::Apple(AppleType::CosmicCrisp);
let tree = Tree::try_from(plant)?;
assert_eq!(plant, tree);
let tree2 = tree.clone();
assert_eq!(tree2.to_string(), "Apple");
let foo = Foo::Foo { x: 3, y: 4 };
assert_eq!(foo.to_string(), "This is not a plant!");
let edible = Edible::Basil(3);
let plant = Plant::from(edible);
assert_eq!(plant.to_string(), "Basil");
// Can't compare two subenums.
// assert_ne!(tree2, edible);
// But we can do some conversion-trickery
assert_ne!(Plant::from(tree2), Plant::from(edible));
Ok(())
}
Subenum特定的进程宏
也许你有一个不能 Copy
的枚举,但子枚举可以,你想要派生它
use subenum::subenum;
#[subenum(Bar, Qux(derive(Copy)))]
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum Foo {
#[subenum(Bar)]
A(String),
#[subenum(Qux)]
B,
#[subenum(Bar, Qux)]
C(u8),
}
fn main() {
let b = Qux::B;
let c = b;
assert_eq!(b, c);
}
限制
生命周期界限(例如 for<'a, 'b, 'c>
)目前不支持。如果您需要这些功能,请提交工单。
功能
default
-std
和error_trait
std
- 在此进程宏中使用标准库集合和分配器error_trait
- 为ConvertError
类型实现Error
。- 当与nightly和
#![feature(error_in_core)]
结合使用时,支持#[no_std]
。 - 否则,此功能还需要
std
。
- 当与nightly和
依赖项
~1.5MB
~36K SLoC