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 , )*
]
}
}
}
}