sql_from_models-proc-macro 0.1.10

A helper crate for `models`
Documentation
use crate::prelude::*;
mod default;

use default::*;

pub struct Column {
    name: Ident,
    ty: Type,
    default: Option<DefaultExpr>,
}

impl ToTokens for Column {
    fn to_tokens(&self, tokens: &mut TokenStream2) {
        let col_name = &self.name;
        let ty = &self.ty;
        let default = &self.default;
        let temp = if let Some(default) = default {
            quote! {
                __models_table.columns.push(
                    ::sql_from_models::private::Column::new_with_default(
                        stringify!(#col_name),
                        <#ty as ::sql_from_models::types::IntoSQL>::into_sql(),
                        <#ty as ::sql_from_models::types::IntoSQL>::IS_NULLABLE,
                        #default
                ));
            }
        } else {
            quote! {
                __models_table.columns.push(
                    ::sql_from_models::private::Column::new(
                        stringify!(#col_name),
                        <#ty as ::sql_from_models::types::IntoSQL>::into_sql(),
                        <#ty as ::sql_from_models::types::IntoSQL>::IS_NULLABLE,
                ));
            }
        };
        tokens.extend(temp);
    }
}

impl Column {
    pub fn new(field: &Field) -> Result<Self> {
        let ty = field.ty.clone();
        let default = Self::get_default(field.attrs.clone())?;
        let name = field.ident.clone().unwrap();
        Ok(Self { ty, default, name })
    }

    fn get_default(attrs: Vec<Attribute>) -> Result<Option<DefaultExpr>> {
        for attr in attrs {
            if attr.path().is_ident("default") {
                let meta = attr.parse_args()?;
                return Ok(Some(meta));
            }
        }
        Ok(None)
    }
}