use syn::{
FieldsNamed,
Ident,
};
use crate::{
field_attributes::FieldAttributes,
internal::NamedField,
serde_attributes::SerdeAttributes,
};
pub(crate) fn parse<'a>(
fields: &'a FieldsNamed,
type_name: &Ident,
serde_enabled: bool,
require_explicit: bool,
) -> syn::Result<Vec<NamedField<'a>>> {
fields
.named
.iter()
.map(|field| {
let identifier = field
.ident
.as_ref()
.expect("syn named fields always have identifiers");
let field_name = identifier.to_string();
let attributes = FieldAttributes::parse(
field,
type_name,
&field_name,
require_explicit,
)?;
let serde_attributes = SerdeAttributes::parse(
field,
type_name,
&field_name,
serde_enabled,
)?;
serde_attributes.validate_redaction_mode(
field,
type_name,
&field_name,
attributes.mode(),
)?;
Ok(NamedField::new(
field,
identifier,
attributes,
serde_attributes,
))
})
.collect()
}