#macro-derive #petgraph #typed #type-safe

enumcapsulate-macros

为 'enumcapsulate' 包提供进程宏

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 进程宏

Download history 36/week @ 2024-04-13 22/week @ 2024-04-20 29/week @ 2024-04-27 193/week @ 2024-05-04 25/week @ 2024-05-11 184/week @ 2024-05-18 46/week @ 2024-05-25 4/week @ 2024-06-01 1/week @ 2024-06-08 17/week @ 2024-07-13 20/week @ 2024-07-20 29/week @ 2024-07-27

每月下载 66
用于 enumcapsulate

MPL-2.0 许可证

45KB
778

enumcapsulate-macros

Crates.io Crates.io Crates.io docs.rs

enumcapsulate 包提供派生宏。


enumcapsulate-macros 进程宏包导出以下派生宏

派生宏 功能
AsVariant AsVariantRefAsVariantMut 提供伞式派生宏
AsVariantMut 为每个变体类型 T 实现对 enumcapsulate::AsVariantMut<T> 的派生实现
AsVariantRef 为每个变体类型 T 实现对 enumcapsulate::AsVariantRef<T> 的派生实现
Encapsulate AsVariantMutAsVariantRefFromFromVariantIntoVariantIsVariantTryIntoVariantDiscriminantVariantDowncast 提供伞式派生宏
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