use darling::{Error, FromDeriveInput, ast::Data, util::Ignored};
use syn::Ident;
use crate::{derive::Variant, generator::EnumLike};
#[derive(FromDeriveInput)]
#[darling(attributes(config), supports(enum_any), and_then = Self::autocorrect)]
pub struct ConfigSubcommand {
ident: Ident,
data: Data<Variant, Ignored>,
#[darling(default)]
skip_all: bool,
#[darling(default)]
tag: Option<String>,
}
impl EnumLike for ConfigSubcommand {
fn ident(&self) -> &Ident {
&self.ident
}
fn variants(&self) -> &[Variant] {
match &self.data {
Data::Enum(variants) => variants,
Data::Struct(_) => unreachable!(),
}
}
fn tag(&self) -> Option<&str> {
self.tag.as_deref()
}
}
impl ConfigSubcommand {
pub fn autocorrect(mut self) -> Result<Self, Error> {
match &mut self.data {
Data::Enum(variants) => variants
.iter_mut()
.for_each(|variant| variant.skip |= self.skip_all),
_ => unreachable!(),
}
Ok(self)
}
}