mod mune;
use proc_macro::{
Delimiter, Spacing, TokenStream,
TokenTree::{self, *},
token_stream::IntoIter,
};
#[proc_macro_attribute]
pub fn mune(attr: TokenStream, item: TokenStream) -> TokenStream {
mune::run(attr, item)
}
fn seek_ident(s: &mut IntoIter, ident: &str) -> bool {
for t in s {
if let Ident(i) = t
&& i.to_string() == ident
{
return true;
}
}
false
}
fn get_idents(tt: &[TokenTree]) -> Vec<String> {
tt.iter()
.filter_map(|t| {
if let Ident(i) = t {
Some(i.to_string())
} else {
None
}
})
.collect()
}
fn get_repr(tt: &[TokenTree]) -> Option<String> {
for (i, t) in tt.iter().enumerate() {
if let Punct(p) = t
&& *p == '#'
&& p.spacing() == Spacing::Alone
&& i < tt.len() - 1
&& let Group(g) = &tt[i + 1]
&& g.delimiter() == Delimiter::Bracket
&& let mut s = g.stream().into_iter()
&& let Some(Ident(id)) = s.next()
&& id.to_string() == "repr"
&& let Some(Group(g)) = s.next()
&& g.delimiter() == Delimiter::Parenthesis
&& let mut s = g.stream().into_iter()
&& let Some(Ident(id)) = s.next()
{
return Some(id.to_string());
}
}
None
}