drylib-procs 0.1.13

Rust macro-library for Don't Repeating Yourself
Documentation
use proc_macro::{
    Span,
    Ident,
    Group,
    Punct,
    Spacing,
    Delimiter,
    TokenTree,
    TokenStream
};

pub fn pubimpl_parse_impl_<I>(iter: I) -> Vec::<TokenTree>
where I: Iterator<Item = TokenTree>
{
    let (mut ts, mut gs, mut next) = (Vec::new(), vec![TokenTree::from(Ident::new("impl", Span::call_site()))], false);
    for tt in iter {
        if next {
            if let TokenTree::Punct(punct) = &tt {
                if punct.as_char().eq(&'>') { next = false; }
            }
            gs.push(tt.clone());
        } else if let TokenTree::Punct(punct) = &tt {
            if punct.as_char().eq(&'<') {
                gs.push(TokenTree::Punct(Punct::new('<', Spacing::Alone)));
                next = true;
            }
        } else if let TokenTree::Group(group) = &tt {
            let mut temp = Vec::new();
            for tt in group.stream().into_iter() {
                if let TokenTree::Ident(ident) = &tt {
                    if ident.to_string().eq(&"fn") {
                        temp.push((Ident::new("pub", Span::call_site())).into());
                    }
                } temp.push(tt);
            }
            ts.push(TokenTree::Group(Group::new(Delimiter::Brace, TokenStream::from_iter(temp))));
            continue;
        } ts.push(tt);
    }

    gs.extend(ts);
    gs
}