vecmerge-impl 0.0.1

A macro for merging vectors
Documentation
extern crate proc_macro;

use proc_macro_hack::proc_macro_hack;

#[proc_macro_hack]
pub fn vecmerge(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    let expr = syn::parse_macro_input!(input as syn::Expr);
    let mut elems = Vec::new();
    extract(expr, &mut elems);
    let result = proc_quote::quote! {{
        let mut v = Vec::new();
        #(#elems)*
        v
    }};
    result.into()
}

fn extract(expr: syn::Expr, elems: &mut Vec<proc_macro2::TokenStream>) {
    match expr {
        syn::Expr::Binary(expr) => {
            if let syn::BinOp::Add(..) = expr.op {
                extract(*expr.left, elems);
                extract(*expr.right, elems);
            }
        }
        syn::Expr::Array(array) => {
            for elem in array.elems.into_iter() {
                elems.push(proc_quote::quote!(v.push(#elem);))
            }
        }
        vector => {
            elems.push(proc_quote::quote!(v.extend(#vector);));
        }
    }
}