use proc_macro2::TokenStream;
use quote::quote;
use syn::Ident;
use super::generated_doc;
use crate::MacroComponents;
pub(crate) fn generate_struct(
ident: &Ident,
fields: &[TokenStream],
attributes: &TokenStream,
) -> TokenStream {
if fields.is_empty() {
quote! {
#attributes
struct #ident {}
}
} else {
quote! {
#attributes
struct #ident {
#( #fields, )*
}
}
}
}
pub(crate) fn generate_cli_struct(
config_ident: &Ident,
components: &MacroComponents,
) -> TokenStream {
let MacroComponents {
cli_ident,
cli_struct_fields,
..
} = components;
let doc = generated_doc(config_ident, "CLI parser struct");
generate_struct(
cli_ident,
cli_struct_fields,
"e! {
#[doc = #doc]
#[derive(clap::Parser, serde::Serialize, Default)]
},
)
}
pub(crate) fn generate_defaults_struct(
config_ident: &Ident,
components: &MacroComponents,
) -> TokenStream {
let MacroComponents {
defaults_ident,
default_struct_fields,
..
} = components;
let doc = generated_doc(config_ident, "Defaults storage struct");
generate_struct(
defaults_ident,
default_struct_fields,
"e! {
#[doc = #doc]
#[derive(serde::Serialize)]
},
)
}