ts-sql-helper-derive 0.6.2

Derives for ts-sql-helper-lib
Documentation
use proc_macro2::TokenStream;
use quote::quote;
use syn::Ident;

use crate::Parameter;

pub fn create_main_struct(name: &Ident, query: &str, parameters: &[Parameter]) -> TokenStream {
    let parameter_fields: Vec<_> = parameters
        .iter()
        .map(|parameter| {
            let name = parameter.name();
            let field_type = parameter.to_syn_type();
            quote! {
                #name: #field_type
            }
        })
        .collect();

    let parameter_names: Vec<_> = parameters
        .iter()
        .map(|parameter| parameter.name())
        .collect();

    let self_parameter_names = parameter_names.iter().map(|param| quote!(&self.#param));

    let parameter_count = parameters.len();

    quote! {
        struct #name<'a> {
            #( #parameter_fields , )*
            pub phantom_data: core::marker::PhantomData<&'a ()>,
        }
        impl<'a> #name<'a> {
            pub const QUERY: &'static str = #query;
            pub fn params(#( #parameter_fields ),*) -> Self {
                Self {
                    #( #parameter_names , )*
                    phantom_data: core::marker::PhantomData,
                }
            }

            pub fn as_array(&'a self) -> [&'a (dyn ts_sql_helper_lib::postgres::types::ToSql + Sync); #parameter_count] {
                [
                    #( #self_parameter_names , )*
                ]
            }
        }
    }
}