mod enums;
mod structs;
pub(crate) use enums::ConfigEnumDefinition;
pub(crate) use enums::VariantDefinition;
pub(crate) use enums::VariantFields;
use quote::ToTokens;
use quote::quote;
pub(crate) use structs::ConfigStructDefinition;
#[derive(Clone)]
pub(crate) enum DefaultValue {
Value(syn::Expr),
Default,
}
impl ToTokens for DefaultValue {
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
match self {
Self::Default => tokens.extend(quote! { Default::default() }),
Self::Value(expr) => tokens.extend(expr.to_token_stream()),
}
}
}
pub(crate) enum FieldValidator {
Skip,
Custom(syn::Path),
}
pub(crate) struct FieldDefinition {
pub(crate) name: syn::Ident,
pub(crate) ty: syn::Type,
pub(crate) vis: syn::Visibility,
pub(crate) attrs: Vec<syn::Attribute>,
pub(crate) cfg_attrs: Vec<syn::Attribute>,
pub(crate) required: Option<syn::Ident>,
pub(crate) default_value: Option<DefaultValue>,
pub(crate) validator: Option<FieldValidator>,
pub(crate) schemars_attrs: Vec<proc_macro2::TokenStream>,
}
impl FieldDefinition {
pub(crate) fn default_value(&self) -> Option<DefaultValue> {
self.default_value
.clone()
.or_else(|| self.required.is_none().then_some(DefaultValue::Default))
}
}