auto_impl 0.1.0

Automatically implement traits for common smart pointers and closures
Documentation
extern crate proc_macro;

use proc_macro::TokenStream;

#[proc_macro_attribute]
pub fn auto_impl(attrs: TokenStream, proc_tokens: TokenStream) -> TokenStream {
    fn expand(attrs: TokenStream, proc_tokens: TokenStream) -> Result<TokenStream, String> {
        let mut tokens = Tokens::new();
        tokens.append(proc_tokens.to_string());

        let mut attr_tokens = Tokens::new();
        attr_tokens.append(format!("#[auto_impl{}]", attrs.to_string()));

        let impl_types = parse_impl_types(attr_tokens)?;

        let tokens = auto_impl_expand(&impl_types, tokens)?;

        TokenStream::from_str(&tokens.to_string()).map_err(|e| format!("{:?}", e))
    }

    match expand(attrs, proc_tokens) {
        Ok(tokens) => tokens,
        Err(e) => panic!("auto impl error: {}", e)
    }
}