use syn::Attribute;
use crate::serde_attrs::model::SerdeContainerAttrs;
use crate::syntax::{consume_unused_meta, parse_string_value};
use super::rename_meta::parse_rename_all_meta;
pub(crate) fn parse_serde_container_attrs(
attributes: &[Attribute],
) -> syn::Result<SerdeContainerAttrs> {
let mut attrs = SerdeContainerAttrs::default();
for attribute in attributes {
if !attribute.path().is_ident("serde") {
continue;
}
attribute.parse_nested_meta(|meta| {
if meta.path.is_ident("rename_all") {
parse_rename_all_meta(
meta,
&mut attrs.rename_all_serialize,
&mut attrs.rename_all_deserialize,
)?;
return Ok(());
}
if meta.path.is_ident("rename_all_fields") {
parse_rename_all_meta(
meta,
&mut attrs.rename_all_fields_serialize,
&mut attrs.rename_all_fields_deserialize,
)?;
return Ok(());
}
if meta.path.is_ident("default") {
attrs.default_fields = true;
consume_unused_meta(meta)?;
return Ok(());
}
if meta.path.is_ident("tag") {
attrs.tag = Some(parse_string_value(meta)?);
return Ok(());
}
if meta.path.is_ident("content") {
attrs.content = Some(parse_string_value(meta)?);
return Ok(());
}
if meta.path.is_ident("untagged") {
attrs.untagged = true;
consume_unused_meta(meta)?;
return Ok(());
}
consume_unused_meta(meta)?;
Ok(())
})?;
}
Ok(attrs)
}