rustorm_codegen 0.20.0

code gen provides macro for generating code on data access objects on table metadata
Documentation
use quote;
use syn;

pub fn impl_from_dao(ast: &syn::MacroInput) -> quote::Tokens {
    let name = &ast.ident;
    let fields: Vec<(&syn::Ident, &syn::Ty)> = match ast.body {
        syn::Body::Struct(ref data) => {
            match *data {
                syn::VariantData::Struct(ref fields) => {
                    fields
                        .iter()
                        .map(|f| {
                            let ident = f.ident.as_ref().unwrap();
                            let ty = &f.ty;
                            (ident, ty)
                        })
                        .collect::<Vec<_>>()
                }
                _ => panic!("Only struct is supported for #[derive(FromDao)]"),
            }
        }
        syn::Body::Enum(_) => panic!("#[derive(FromDao)] can only be used with structs"),
    };
    let from_fields: Vec<quote::Tokens> = fields
        .iter()
        .map(|&(field, _ty)| {
            quote! { #field: dao.get(stringify!(#field)).unwrap(),}
        })
        .collect();

    quote! {
        impl rustorm_dao::FromDao for  #name {

            fn from_dao(dao: &rustorm_dao::Dao) -> Self {
                #name {
                    #(#from_fields)*
                }

            }
        }
    }
}

pub fn impl_to_dao(ast: &syn::MacroInput) -> quote::Tokens {
    let name = &ast.ident;
    let generics = &ast.generics;
    let fields: Vec<(&syn::Ident, &syn::Ty)> = match ast.body {
        syn::Body::Struct(ref data) => {
            match *data {
                syn::VariantData::Struct(ref fields) => {
                    fields
                        .iter()
                        .map(|f| {
                            let ident = f.ident.as_ref().unwrap();
                            let ty = &f.ty;
                            (ident, ty)
                        })
                        .collect::<Vec<_>>()
                }
                _ => panic!("Only struct is supported for #[derive(ToDao)]"),
            }
        }
        syn::Body::Enum(_) => panic!("#[derive(ToDao)] can only be used with structs"),
    };
    let from_fields: &Vec<quote::Tokens> = &fields
        .iter()
        .map(|&(field, _ty)| {
            quote! { dao.insert(stringify!(#field), &self.#field);}
        })
        .collect();

    quote! {
        impl #generics rustorm_dao::ToDao for #name #generics {
            fn to_dao(&self) -> rustorm_dao::Dao {
                let mut dao = rustorm_dao::Dao::new();
                #(#from_fields)*
                dao
            }
        }

    }
}

#[cfg(test)]
mod tests {}