1 个不稳定版本
0.1.0 | 2024年7月3日 |
---|
#1515 在 过程宏 中
4,079 每月下载量
在 2 个crate中使用(通过 iroh)
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),
}
在这里,我们定义了从 GetRequest
到 StoreRequest
的转换,从 StoreRequest
到 Request
的转换,然后直接从 GetRequest
到 Request
的转换,以及相反方向的相应 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