7 个版本
0.2.4 | 2024年7月4日 |
---|---|
0.2.3 | 2024年6月4日 |
0.1.1 | 2024年6月3日 |
748 在 开发工具
每月下载量 87
28KB
635 行
metamatch!
一个用于生成重复匹配分支的 Rust proc-macro。
除非枚举变体的类型未被使用,否则不同变体的匹配分支不能合并,即使匹配分支的主体在语法上是相同的。
此宏实现了一个简单的模板属性(#[expand]
),以自动生成必要的副本。
Rustfmt 和 rust-analyzer 可以完全理解这个宏。即使是影响 #[expand]
(如更改枚举变体的名称)的自动重构也能正确工作。
示例
use metamatch::metamatch;
enum DynVec {
I32(Vec<i32>),
I64(Vec<i64>),
F32(Vec<f32>),
F64(Vec<f64>),
}
enum DynSlice<'a> {
I32(&'a [i32]),
I64(&'a [i64]),
F32(&'a [f32]),
F64(&'a [f64]),
}
impl DynVec {
fn as_slice(&self) -> DynSlice<'_> {
metamatch!(match self {
#[expand(T in [I32, I64, F32, F64])]
DynVec::T(v) => DynSlice::T(v),
})
}
fn promote_to_64(&mut self) {
metamatch!(match self {
// multiple replacement expressions supported
#[expand((SRC, TGT, TYPE) in [
(I32, I64, i64),
(F32, F64, f64),
])]
DynVec::SRC(v) => {
*self = DynVec::TGT(
std::mem::take(v).into_iter().map(|v| v as TYPE).collect(),
);
}
// the types are unused, the match body can be shared
#[expand_pattern(T in [I64, F64])]
DynVec::T(_) => (),
})
}
}