tier-derive 0.1.17

Derive macros for tier Rust configuration metadata
Documentation
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)
}