It was just a quick solution showing how to do it with one macro and zero dependencies, utilizing the power of meta variables. It probably can be made nicer.
Side Note: It’s not directly relevant/needed here, but this also shows that maybe a theoretical $reverse{} meta variable can be useful with repeated patterns, to in this case generate the variants in the expected order.
(slightly edited from initial version)
#![feature(macro_metavar_expr_concat)] #![feature(macro_metavar_expr)] macro_rules! gen_enums { ([$($name:ident)+]) => { gen_enums!(${count($name)}: [$($name)+]); }; ($n:literal: [$($name:ident)+]) => { enum ${concat(Position, $n)} { $($name,)+ } }; ($name:ident, $($tail:ident,)*) => { gen_enums!([$name $($tail)*]); gen_enums!($($tail,)*); }; () => {}; }Not nearly as readable though
It was just a quick solution showing how to do it with one macro and zero dependencies, utilizing the power of meta variables. It probably can be made nicer.
Side Note: It’s not directly relevant/needed here, but this also shows that maybe a theoretical
$reverse{}meta variable can be useful with repeated patterns, to in this case generate the variants in the expected order.