4个版本 (2个破坏性版本)
0.3.0 | 2024年5月24日 |
---|---|
0.2.2 | 2024年5月23日 |
0.2.1 | 2024年5月5日 |
0.1.0 | 2024年1月22日 |
#950 in 进程宏
每月下载 66 次
用于 enumcapsulate
45KB
778 行
enumcapsulate-macros
为 enumcapsulate 包提供派生宏。
宏
enumcapsulate-macros
进程宏包导出以下派生宏
派生宏 | 功能 |
---|---|
AsVariant |
为 AsVariantRef 和 AsVariantMut 提供伞式派生宏 |
AsVariantMut |
为每个变体类型 T 实现对 enumcapsulate::AsVariantMut<T> 的派生实现 |
AsVariantRef |
为每个变体类型 T 实现对 enumcapsulate::AsVariantRef<T> 的派生实现 |
Encapsulate |
为 AsVariantMut 、AsVariantRef 、From 、FromVariant 、IntoVariant 、IsVariant 、TryInto 、VariantDiscriminant 和 VariantDowncast 提供伞式派生宏 |
From |
为每个变体类型 T 实现对 core::convert::From<T> 的派生实现 |
FromVariant |
为每个变体类型 T 实现对 enumcapsulate::FromVariant<T> 的派生实现 |
IntoVariant |
为每个变体类型 T 实现对 enumcapsulate::FromVariant<T> 的派生实现 |
IsVariant |
为 enumcapsulate::IsVariant 提供派生实现 |
TryInto |
为每个变体类型 T 推导 core::convert::TryInto<T> 的实现 |
VariantDiscriminant |
为 enumcapsulate::VariantDiscriminant 推导实现 |
宏辅助属性
大多数 derive 宏支持辅助属性
#[enumcapsulate(exclude)]
该 crate 中的基于变体的 derive 宏将对枚举中找到的每个单字段变体执行 derive。这可能导致不期望的误报,其中像 ToBeExcluded
这样的变体无意中被检测为 bool
类型的变体。
给定如下枚举 …
struct VariantA {
// ...
}
struct VariantB {
// ...
}
#[derive(FromVariant)]
enum Enum {
VariantA(VariantA),
VariantB(VariantB),
ToBeExcluded { flagToBeExcluded: bool },
}
… 以下实现将从上述代码中推导出来
impl FromVariant<VariantA> for Enum {
// ...
}
impl FromVariant<VariantB> for Enum {
// ...
}
// Notice how the derive picked up the `is_cool: bool` field
// as an inner variant and generated an impl for it:
impl FromVariant<bool> for Enum {
// ...
}
将 #[enumcapsulate(exclude)]
添加到不期望的变体 …
#[derive(FromVariant)]
enum Enum {
// ...
#[enumcapsulate(exclude)]
ToBeExcluded { flag: bool },
}
… 使得不期望的 impl FromVariant<bool> for Enum
被省略。
#[enumcapsulate(include(field=…_)]
该 crate 中的基于变体的 derive 宏将跳过对枚举中找到的任何多字段变体的 derive。
这可能导致不期望的误判,其中像 ToBeIncluded
这样的变体无意中被检测为 bool
类型的变体。
对于元组变体,字段可以通过其索引指定: #[enumcapsulate(include(field = INDEX))]
对于结构体变体,字段可以通过其名称指定: #[enumcapsulate(include(field = "NAME"))]
给定如下枚举 …
struct VariantA {
// ...
}
struct VariantB {
// ...
}
struct VariantC {
// ...
}
#[derive(FromVariant)]
enum Enum {
VariantA(VariantA),
ToBeIncludedB(bool, VariantB),
ToBeIncludedC { flag: bool, variant: VariantC },
}
… 以下实现将从上述代码中推导出来
impl FromVariant<VariantA> for Enum {
// ...
}
// Notice how the variants `ToBeIncludedB { … }` and `ToBeIncludedC { … }`
// produced no impls, due to having more than one field.
将 #[enumcapsulate(include(field = …))]
添加到所需的变体,并指定所需的变体字段 …
#[derive(FromVariant)]
enum Enum {
// ...
#[enumcapsulate(include(field = 1))]
ToBeIncludedB(bool, VariantB),
#[enumcapsulate(include(field = "variant"))]
ToBeIncludedC { flag: bool, variant: VariantC },
}
… 使得变体具有其 impl FromVariant<…> for Enum
的 derive,如所需的那样
// ...
impl FromVariant<VariantB> for Enum {
// ...
}
impl FromVariant<VariantC> for Enum {
// ...
}
然而请注意,#[derive(From)]
和 #[derive(FromVariant)]
(目前)仍然无法为具有多个字段的变体生成实现。
辅助属性支持
请查看下表以确定哪些 derive 宏支持哪些辅助属性
#[enumcapsulate(exclude)] |
#[enumcapsulate(include(field=…))] |
|
---|---|---|
AsVariant |
✔ 支持的 | ✔ 支持的 |
AsVariantMut |
✔ 支持的 | ✔ 支持的 |
AsVariantRef |
✔ 支持的 | ✔ 支持的 |
Encapsulate |
✔ 支持的 | ✔ 支持的 |
From |
✔ 支持的 | ✘ 不支持的 |
FromVariant |
✔ 支持的 | ✘ 不支持的 |
IntoVariant |
✔ 支持的 | ✔ 支持的 |
IsVariant |
✔ 支持的 | ✔ 支持的 |
TryInto |
✔ 支持的 | ✔ 支持的 |
VariantDiscriminant |
✘ 不支持的 | ✘ 不支持的 |
文档
请参阅 docs.rs 上的文档。
贡献
请阅读 CONTRIBUTING.md 了解我们的 行为准则,
以及向我们提交拉取请求的过程。
版本控制
我们使用 SemVer 进行版本控制。有关可用的版本,请参阅此存储库的 标签。
许可证
本项目受 MPL-2.0 许可 – 请参阅 LICENSE.md 文件以获取详细信息。
依赖项
~255–700KB
~17K SLoC