mod analyze_field;
mod generate_config_meta;
use generate_config_meta::generate_config_meta;
use proc_macro::TokenStream;
use quote::quote;
use syn::{Data, DeriveInput, parse_macro_input};
#[proc_macro_derive(Konfik, attributes(konfik, serde, command))]
pub fn derive_config(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let Data::Struct(data) = &input.data else {
return syn::Error::new_spanned(&input, "Only structs are supported")
.to_compile_error()
.into();
};
let config_meta = generate_config_meta(&data.fields, name);
TokenStream::from(quote! {
#config_meta
impl ::konfik::LoadConfig for #name {
fn load() -> Result<Self, ::konfik::Error> {
::konfik::ConfigLoader::default().load()
}
}
})
}
#[proc_macro_derive(Nested, attributes(konfik, serde, command))]
pub fn derive_nested_types(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let Data::Struct(data) = &input.data else {
return syn::Error::new_spanned(&input, "Only structs are supported")
.to_compile_error()
.into();
};
let config_meta = generate_config_meta(&data.fields, name);
TokenStream::from(quote! {
#config_meta
})
}