macro_rules! macro_attr {
(
$(#[$($attrs:tt)+])*
$(pub $(($($vis:tt)+))?)? enum $($it:tt)+
) => { ... };
(
$(#[$($attrs:tt)+])*
$(pub $(($($vis:tt)+))?)? struct $($it:tt)+
) => { ... };
(
$(#[$($attrs:tt)+])*
$(pub $(($($vis:tt)+))?)? trait $($it:tt)+
) => { ... };
(
$(#[$($attrs:tt)+])*
$vis:vis $keyword:ident $($it:tt)+
) => { ... };
}Expand description
When given an item definition, including its attributes, this macro parses said attributes
and dispatches any derivations suffixed with ! to user-defined macros.
This allows multiple macros to process the same item.
Given the following input:
#[derive(Copy, Name!(args...), Clone, Another!, Debug)]
struct Foo;macro_attr! will expand to the equivalent of:
#[derive(Copy, Clone, Debug)]
struct Foo;
Name!((args...) struct Foo;);
Another!(() struct Foo;);Note that macro derives may be mixed with regular derives,
or put in their own #[derive(...)] attribute.
Also note that macro derive invocations are not passed the other attributes on the item;
input will consist of the arguments provided to the derivation (i.e. (args...)
in this example), the item’s visibility (if any), and the item definition itself.
A macro derivation invoked without arguments will be treated as though
it was invoked with empty parentheses. i.e. #[derive(Name!)] is equivalent to #[derive(Name!())].
A derivation macro may expand to any number of new items derived from the provided input.