1 个不稳定版本
0.1.0 | 2023年7月16日 |
---|
#196 在 #attributes
27 每月下载量
58KB
1.5K SLoC
可能的枚举辅助工具矩阵及其可以生成的枚举。
------------------------|------|---------|---------|---------|
| Enum | TagEnum | RefEnum | MutEnum |
------------------------|------|---------|---------|---------|
Can be generated | | X | X | X |
########################|######|#########|#########|#########|
Is Function | X | X | X | X |
------------------------|------|---------|---------|---------|
Unwrap Function | X | | X | X |
------------------------|------|---------|---------|---------|
UnwrapRef Function | X | | | |
------------------------|------|---------|---------|---------|
UnwrapMut Function | X | | | |
------------------------|------|---------|---------|---------|
ToTag Function | X | | X | X |
------------------------|------|---------|---------|---------|
AsRef Function | X | | | |
------------------------|------|---------|---------|---------|
AsMut Function | X | | | |
------------------------|------|---------|---------|---------|
Get | X | | X | X |
------------------------|------|---------|---------|---------|
GetRef | X | | | |
------------------------|------|---------|---------|---------|
GetMut | X | | | |
------------------------|------|---------|---------|---------|
TagEnum、RefEnum 和 MutEnums 是可以生成的枚举本身。其他项是为交叉枚举实现的函数。例如
#[generate_enum_helper(TagEnum, RefEnum, MutEnum, is, unwrap, unwrap_mut, to_tag, as_mut, get)]
enum MyEnum { Variant1(Type) }
生成的代码看起来像
enum MyEnum { Varaint1(Type), ... }
enum MyEnumTag { Variant1, ... }
enum MyEnumRef<'a> { Variant1(&'a Type), ... }
enum MyEnumMut<'a> { Varaint1(&'a mut Type), ... }
impl MyEnum {
fn is_variant1(&self) -> bool {...} // And other is_... functions
fn unwrap_variant1(self) -> Type {...} // And other unwrap_ functions
fn unwrap_mut_variant1(&mut self) -> &mut Type { ... } // And other unwrap_mut functions
fn to_tag(&self) -> MyEnumTag {...}
fn as_mut(&self) -> MyEnumMut<'_> {...}
fn get_variant1(self) -> Option<Type> { ...} // And other variant functions
}
impl MyEnumTag {
fn is_variant1(self) -> bool {...} // And other is_... functions
}
impl<'a> MyEnumRef<'a> {
fn to_tag(&self) -> MyEnumTag { ... }
fn unwrap_variant1(&self) -> &'a mut Type { ... } // And other unwrap_ functions
}
generate_enum_helpers 与命名和未命名的变体字段一起工作。它还适用于没有、单个或多个字段的变体。在多个字段的情况下,unwrap 函数返回元组。此外,派生和属性宏应用于除 TagEnum 之外的所有生成的枚举。请在 GitHub 上报告任何问题。要查看此过程宏生成的代码,可以使用如下命令 cargo expand
。例如,使用 cargo expand --test named_multifield
在单个集成测试上运行 cargo expand
。
依赖项
~275–730KB
~17K SLoC