google-cloud-spanner-derive 0.2.0

Google Cloud Platform spanner client library macro derive.
Documentation
use quote::{quote, ToTokens};
use syn::ItemStruct;

use crate::column::Column;

pub(crate) fn generate_query_methods(item: ItemStruct) -> impl ToTokens {
    let struct_name = item.ident;

    let mut try_from_struct_fields = Vec::with_capacity(item.fields.len());
    for field in &item.fields {
        let field_var = field.ident.as_ref().unwrap();
        let column = Column::from(field);
        let column_name = column.name();
        try_from_struct_fields.push(quote! {
            #field_var: s.column_by_name(#column_name)?
        });
    }

    quote! {
        impl TryFromStruct for #struct_name {
            fn try_from_struct(s: Struct<'_>) -> Result<Self, RowError> {
                Ok(#struct_name {
                    #(
                        #try_from_struct_fields,
                    )*
                })
            }
        }

        impl TryFrom<Row> for #struct_name {
            type Error = RowError;
            fn try_from(s: Row) -> Result<Self, RowError> {
                Ok(#struct_name {
                    #(
                        #try_from_struct_fields,
                    )*
                })
            }
        }
    }
}