func_core 0.1.0

Procedural macro to create a functional core for named structs
Documentation
use proc_macro2;
use quote::quote;
use syn;
use syn::{Fields, Ident, Type, TypeGenerics};

pub fn new(name: &Ident, fields: &Fields, generics: &TypeGenerics) -> proc_macro2::TokenStream {
    if let syn::Fields::Named(syn::FieldsNamed { ref named, .. }) = fields {
        let field_names: Vec<Option<Ident>> = named.clone().into_iter().map(|x| x.ident).collect();
        quote! {
            pub fn new(#(#named),*) -> #name #generics {
                #name {
                    #(#field_names),*
                }
            }
        }
    } else {
        panic!("This macro only works for named structs!")
    }
}

pub fn getters(fields: &Fields) -> proc_macro2::TokenStream {
    if let syn::Fields::Named(syn::FieldsNamed { ref named, .. }) = fields {
        let fields_names: Vec<Option<Ident>> = named.clone().into_iter().map(|x| x.ident).collect();
        let function_return: Vec<Type> = named.clone().into_iter().map(|x| x.ty).collect();
        let function_body = fields_names.clone();
        quote! {
            #(
                pub fn #fields_names(&self) -> &#function_return {
                    &self.#function_body
                }
            )*
        }
    } else {
        panic!("This macro only works for named structs!")
    }
}