#match #boilerplate #repetition #generator #macro #generate #no-alloc

无 std metamatch

用于生成重复匹配分支的 proc-macro

7 个版本

0.2.4 2024年7月4日
0.2.3 2024年6月4日
0.1.1 2024年6月3日

748开发工具

Download history 510/week @ 2024-06-01 35/week @ 2024-06-08 14/week @ 2024-06-15 5/week @ 2024-06-22 122/week @ 2024-06-29 29/week @ 2024-07-06 46/week @ 2024-07-27

每月下载量 87

MIT 许可证

28KB
635

metamatch!

githubgithub-buildcrates-iomsrvdocs-rs

一个用于生成重复匹配分支的 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(_) => (),
        })
    }
}

许可证

MIT

无运行时依赖