Metamatch
A proc-macro for generating repetitive match arms.
Example
use metamatch::metamatch;
enum Number {
I32(i32),
I64(i64),
U32(u32),
U64(u64),
F32(f32),
F64(f64),
}
impl Number {
fn as_i32(&self) -> Option<i32> {
metamatch!(match self {
Self::I32(v) => Some(*v),
#[expand(T in [I64, U32, U64])]
Self::T(v) => (*v).try_into().ok(),
#[expand(T in [F32, F64])]
Self::T(v) => Some(*v as i32)
})
}
fn promote_to_64(&mut self) {
metamatch!(match self {
#[expand(T in [I64, U64, F64])]
Self::T(_) => (),
#[expand((SRC, TGT, TYPE) in [
(I32, I64, i64),
(U32, U64, u64),
(F32, F64, f64),
])]
Self::SRC(v) => {
*self = Self::TGT(*v as TYPE)
}
})
}
}