use quote::quote;
#[must_use]
pub fn code_gen(
parsed: &crate::parse::append_to_query_shared::Parsed<'_>,
mapping_paths: crate::mapping::append_to_query_with_separator::MappingPaths,
) -> proc_macro2::TokenStream {
let runtime = &mapping_paths.runtime;
let crate::parse::append_to_query_shared::Parsed {
wrapper_ident: name,
inner_ty,
} = parsed;
let columns = mapping_paths.columns;
quote! {
impl #runtime::AppendToQueryWithSeparator for #name {
fn append_to_query<DB: #runtime::BindValues>(
&self,
query_builder: &mut #runtime::QueryBuilder<'_, DB>,
separator: &str,
) {
<#columns as #runtime::Columns>::push_conditions(query_builder, self.0.conditions(), separator);
}
}
impl #name {
pub fn append_to_query<DB: #runtime::BindValues>(
&self,
query_builder: &mut #runtime::QueryBuilder<'_, DB>,
separator: &str,
) {
<Self as #runtime::AppendToQueryWithSeparator>::append_to_query(self, query_builder, separator);
}
}
#runtime::assert_columns!(#columns, <#inner_ty as #runtime::PersistedFields>::FIELD_NAMES);
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_code_gen() {
let parsed = crate::parse::append_to_query_shared::Parsed {
wrapper_ident: "e::format_ident!("OrdersFilterOptionsModelWrapper"),
inner_ty: &syn::parse_str("OrdersFilterOptionsModel").unwrap(),
};
let mapping_paths = crate::mapping::append_to_query_with_separator::MappingPaths {
columns: syn::parse_str("crate::entities::order::Order").unwrap(),
runtime: syn::parse_quote!(::queryweave_sql),
};
let token_stream = super::code_gen(&parsed, mapping_paths);
insta::assert_snapshot!(prettyplease::unparse(
&syn::parse2::<syn::File>(token_stream).unwrap()
));
}
}