use super::*;
pub(crate) fn generate_struct_entry_impl(
entry_name: &Ident,
generics: &syn::Generics,
fields: &[MetricsField],
root_attrs: &RootAttributes,
) -> Ts2 {
let writes = generate_write_statements(fields, root_attrs);
let sample_groups = generate_sample_group_statements(fields, root_attrs);
let mut impl_generics = generics.clone();
impl_generics
.params
.push(syn::parse_quote!(NS: ::metrique::NameStyle));
let (impl_generics, _, _) = impl_generics.split_for_impl();
let (_, ty_generics, where_clause) = generics.split_for_impl();
let mixed = proc_macro2::Span::mixed_site();
let writer_ident = mixed_site_writer();
let self_ident = mixed_site_self();
let write_fn = quote_spanned! {mixed=>
fn write<'__metrique_write>(&'__metrique_write self, #writer_ident: &mut impl ::metrique::writer::EntryWriter<'__metrique_write>) {
let #self_ident = self;
#(#writes)*
}
};
let sample_group_fn = quote_spanned! {mixed=>
fn sample_group(&self) -> impl ::std::iter::Iterator<Item = (::std::borrow::Cow<'static, str>, ::std::borrow::Cow<'static, str>)> {
let #self_ident = self;
#sample_groups
}
};
quote! {
const _: () = {
#[expect(deprecated)]
impl #impl_generics ::metrique::InflectableEntry<NS> for #entry_name #ty_generics #where_clause {
#write_fn
#sample_group_fn
}
};
}
}
fn generate_write_statements(fields: &[MetricsField], root_attrs: &RootAttributes) -> Vec<Ts2> {
let mut writes = Vec::new();
let writer_ident = mixed_site_writer();
let self_ident = mixed_site_self();
for field_ident in root_attrs.configuration_field_names() {
writes.push(quote! {
::metrique::writer::Entry::write(&#self_ident.#field_ident, #writer_ident);
});
}
writes.extend(generate_field_writes(
fields,
root_attrs,
|field_ident| quote! { &#self_ident.#field_ident },
));
writes
}
fn generate_sample_group_statements(fields: &[MetricsField], root_attrs: &RootAttributes) -> Ts2 {
let self_ident = mixed_site_self();
let sample_group_fields: Vec<_> = fields
.iter()
.filter_map(|field| {
collect_field_sample_group(field, root_attrs, |f| quote! { &#self_ident.#f })
.map(|(_, iter)| iter)
})
.collect();
make_binary_tree_chain(sample_group_fields)
}