#枚举 #转换 #协议 # #转换

nested_enum_utils

提供嵌套枚举转换的宏

1 个不稳定版本

0.1.0 2024年7月3日

#1515过程宏

Download history 370/week @ 2024-06-30 1050/week @ 2024-07-07 912/week @ 2024-07-14 1108/week @ 2024-07-21 989/week @ 2024-07-28

4,079 每月下载量
2 个crate中使用(通过 iroh

MIT/Apache

12KB
155

嵌套枚举工具

本crate提供了一个单独的属性宏,用于将枚举实例转换为枚举类型本身或其他类型。

它只适用于每个变体只有一个未命名字段的枚举,并且如果每个变体都有独特的类型。

最基本的使用是提供枚举实例与枚举类型之间的转换。您可以使用流行的 derive_more crate 实现类似的功能。

#[enum_conversions()]
enum Request {
  Get(GetRequest),
  Put(PutRequest),
}

更高级的使用,也是这个crate存在的原因,是提供枚举变体与任何具有对枚举进行 转换 的类型的转换。这使得可以使用嵌套枚举,就像在具有多个子系统的复杂协议中那样。

#[enum_conversions(Request)]
enum StoreRequest {
  Get(GetRequest),
  Put(PutRequest),
}

#[enum_conversions(Request)]
enum NetworkRequest {
  Ping(PingRequest),
}

#[enum_conversions()]
enum Request {
  Store(StoreRequest),
  Network(NetworkRequest),
}

在这里,我们定义了从 GetRequestStoreRequest 的转换,从 StoreRequestRequest 的转换,然后直接从 GetRequestRequest 的转换,以及相反方向的相应 TryFrom 转换。

生成的转换

生成的 From 转换很简单。显然,总是可以从枚举实例转换到枚举本身。

我们还从枚举到每个变体,以及从枚举的引用到变体的引用生成 TryFrom 转换。

接受值的转换与 derive_more 中的不同:错误情况下返回未修改的输入,允许链式转换尝试。

let request = ...
match GetRequest::try_from(request) {
  Ok(get) => // handle get request
  Err(request) => {
    // I still got the request and can try something else
    match PutRequest::try_from(request) {
      ...
    }
  }
}

接受引用的转换仅返回一个 &'static str 作为错误类型。引用是 Copy,所以我们可以总是重试。

依赖关系

~2.5MB
~59K SLoC