use proc_macro::{Delimiter, Group, TokenStream, TokenTree};
#[proc_macro_attribute]
pub fn hollow(attr: TokenStream, item: TokenStream) -> TokenStream {
let body_tokens = if attr.is_empty() {
"Default::default()".parse().unwrap()
} else {
let mut iter = attr.into_iter();
let Some(TokenTree::Ident(next)) = iter.next() else {
panic!("invalid attr argument");
};
assert_eq!("value", &next.to_string());
let Some(TokenTree::Punct(next)) = iter.next() else {
panic!("invalid attr argument");
};
assert_eq!('=', next.as_char());
TokenStream::from_iter(iter)
};
let mut tokens = Vec::new();
for token in item.into_iter() {
match token {
TokenTree::Group(group) => match group.delimiter() {
Delimiter::Brace => break,
_ => tokens.push(TokenTree::Group(group)),
},
other => tokens.push(other),
}
}
tokens.push(TokenTree::Group(Group::new(Delimiter::Brace, body_tokens)));
TokenStream::from_iter(tokens)
}