use darling::{
Error, FromDeriveInput,
ast::{Data, Fields},
util::Ignored,
};
use syn::Ident;
use crate::{
derive::{ConfigPrecedence, NamedField},
generator::StructLike,
};
#[derive(FromDeriveInput)]
#[darling(attributes(config), supports(struct_named), and_then = Self::autocorrect)]
pub struct ConfigParser {
ident: Ident,
data: Data<Ignored, NamedField>,
#[darling(default)]
skip_all: bool,
#[darling(default)]
precedence: Option<ConfigPrecedence>,
}
impl StructLike for ConfigParser {
fn ident(&self) -> &Ident {
&self.ident
}
fn fields(&self) -> &[NamedField] {
match &self.data {
Data::Struct(fields) => &fields.fields,
Data::Enum(_) => unreachable!(),
}
}
}
impl ConfigParser {
fn autocorrect(mut self) -> Result<Self, Error> {
match &mut self.data {
Data::Struct(Fields { fields, .. }) => fields.iter_mut().for_each(|field| {
field.skip |= self.skip_all;
if field.precedence.is_none() {
field.precedence = self.precedence;
}
}),
_ => unreachable!(),
}
Ok(self)
}
}