#[macro_export]
macro_rules! et {
($variant:ty, $value:ty, $COUNT:block, |$variable:ident| $($tt:tt)*) => {
{
let mut builder = $crate::builder::EnumTableBuilder::<$variant, $value, $COUNT>::new();
let mut i = 0;
while i < builder.capacity() {
let $variable = &<$variant as $crate::Enumable>::VARIANTS[i];
let value = $($tt)*;
unsafe {
builder.push_unchecked($variable, value);
}
i += 1;
}
unsafe { builder.build_to_unchecked() }
}
};
($variant:ty, $value:ty, |$variable:ident| $($tt:tt)*) => {
$crate::et!($variant, $value, { <$variant as $crate::Enumable>::COUNT }, |$variable| $($tt)*)
};
}
#[cfg(test)]
mod tests {
use crate::{EnumTable, Enumable};
#[test]
fn et_macro() {
#[derive(Clone, Copy, Enumable)]
enum Test {
A,
B,
C,
}
const TABLE: EnumTable<Test, &'static str, { Test::COUNT }> =
et!(Test, &'static str, |t| match t {
Test::A => "A",
Test::B => "B",
Test::C => "C",
});
assert_eq!(TABLE.get(&Test::A), &"A");
assert_eq!(TABLE.get(&Test::B), &"B");
assert_eq!(TABLE.get(&Test::C), &"C");
}
}