use syn::{Data, DeriveInput, Fields};
use super::{FieldAttrs, StructAttrs, parse_field_attrs, parse_struct_attrs};
pub(crate) fn parse_input(
input: &DeriveInput,
) -> Result<(syn::Ident, Vec<syn::Field>, StructAttrs, Vec<FieldAttrs>), syn::Error> {
let ident = input.ident.clone();
let struct_attrs = parse_struct_attrs(&input.attrs)?;
let fields = match &input.data {
Data::Struct(data) => match &data.fields {
Fields::Named(named) => named.named.iter().cloned().collect::<Vec<_>>(),
_ => {
return Err(syn::Error::new_spanned(
data.struct_token,
"OrthoConfig requires named fields",
));
}
},
_ => {
return Err(syn::Error::new_spanned(
ident.clone(),
"OrthoConfig can only be derived for structs",
));
}
};
let mut field_attrs = Vec::new();
for f in &fields {
field_attrs.push(parse_field_attrs(f)?);
}
Ok((ident, fields, struct_attrs, field_attrs))
}