#[macro_use] extern crate macro_attr;
macro_rules! Name {
(
()
struct $name:ident $($_tail:tt)*
) => {
impl $name {
pub fn name() -> &'static str {
stringify!($name)
}
}
};
}
macro_rules! remove_body {
(
(),
then $cb:tt,
$(#[$($attrs:tt)*])*
struct $name:ident $($_tail:tt)*
) => {
macro_attr_callback! {
$cb,
$(#[$($attrs)*])*
struct $name;
}
};
}
macro_rules! use_secret_alias {
(
($name:ident),
then $cb:tt,
$(#[$($attrs:tt)*])*
struct $_old_name:ident $($tail:tt)*
) => {
macro_attr_callback! {
$cb,
$(#[$($attrs)*])*
struct $name $($tail)*
}
};
}
macro_attr! {
#[derive(Debug, Name!)]
#[remove_body!]
#[use_secret_alias!(Alucard)]
struct Dracula {
pub vulnerabilities: Vec<Vulnerability>,
}
}
#[test]
fn test_mac_attrs() {
assert_eq!(format!("{:?}", Alucard), "Alucard");
assert_eq!(Alucard::name(), "Alucard");
}