#[macro_export]
macro_rules! mod_set {
(@munch $set:ident,) => {};
(@munch $set:ident, @complex $name:literal => [ $( ($part:literal, $reduce:expr) ),* $(,)? ] => $expr:literal , $($rest:tt)*) => {
$set.add_builder($crate::modifier_set::ComplexAttribute::new(
$name, &[ $( ($part, $reduce) ),* ], $expr,
));
$crate::mod_set!(@munch $set, $($rest)*);
};
(@munch $set:ident, @complex $name:literal => [ $( ($part:literal, $reduce:expr) ),* $(,)? ] => $expr:literal) => {
$set.add_builder($crate::modifier_set::ComplexAttribute::new(
$name, &[ $( ($part, $reduce) ),* ], $expr,
));
};
(@munch $set:ident, @build $builder:expr , $($rest:tt)*) => {
$set.add_builder($builder);
$crate::mod_set!(@munch $set, $($rest)*);
};
(@munch $set:ident, @build $builder:expr) => {
$set.add_builder($builder);
};
(@munch $set:ident, $attribute:literal [ $($tag:tt)+ ] => $value:expr , $($rest:tt)*) => {
$set.add_tagged($attribute, $value, $($tag)+);
$crate::mod_set!(@munch $set, $($rest)*);
};
(@munch $set:ident, $attribute:literal [ $($tag:tt)+ ] => $value:expr) => {
$set.add_tagged($attribute, $value, $($tag)+);
};
(@munch $set:ident, $attribute:literal => $value:expr , $($rest:tt)*) => {
$set.add($attribute, $value);
$crate::mod_set!(@munch $set, $($rest)*);
};
(@munch $set:ident, $attribute:literal => $value:expr) => {
$set.add($attribute, $value);
};
{ $($tt:tt)* } => {{
let mut _set = $crate::modifier_set::ModifierSet::new();
$crate::mod_set!(@munch _set, $($tt)*);
_set
}};
}
#[macro_export]
macro_rules! attributes {
{ $($tt:tt)* } => {
$crate::modifier_set::AttributeInitializer::new($crate::mod_set!{ $($tt)* })
};
}