use darling::FromField;
use proc_macro2::TokenStream;
use quote::quote;
use syn::{Fields, Ident};
use crate::parse::{FieldAttrs, StructAttrs};
pub fn generate_modules_impl(
struct_ident: &Ident,
_attrs: &StructAttrs,
fields: &Fields,
) -> TokenStream {
let mut group_names: Vec<TokenStream> = Vec::new();
let mut seen_groups: Vec<String> = Vec::new();
for field in fields.iter() {
let _ident = match &field.ident {
Some(i) => i,
None => continue,
};
let attrs = match FieldAttrs::from_field(field).ok() {
Some(a) => a,
None => continue,
};
if let Some(group) = &attrs.module_group {
if !seen_groups.contains(group) {
seen_groups.push(group.clone());
group_names.push(quote! { #group });
}
}
}
let register_calls: Vec<TokenStream> = group_names
.iter()
.map(|group_name| {
quote! {
registry.register_group(#group_name, vec![], None);
}
})
.collect();
quote! {
impl #struct_ident {
pub fn module_registry() -> confers::modules::ModuleRegistry {
let mut registry = confers::modules::ModuleRegistry::new();
#(#register_calls)*
registry
}
pub fn module_groups() -> Vec<&'static str> {
vec![#(#group_names),*]
}
}
}
}