tier-derive 0.1.17

Derive macros for tier Rust configuration metadata
Documentation
use quote::quote;
use syn::{DataStruct, Fields};

use crate::serde_attrs::{SerdeContainerAttrs, SerdeFieldContext};

use super::field::expand_patch_fields_metadata;
use super::validate::ensure_struct_patch_container_attrs;

pub(super) fn expand_patch_struct(
    data_struct: DataStruct,
    container_attrs: &SerdeContainerAttrs,
) -> syn::Result<proc_macro2::TokenStream> {
    ensure_struct_patch_container_attrs(container_attrs)?;

    let field_tokens = match data_struct.fields {
        Fields::Named(fields) => {
            expand_patch_fields_metadata(fields, SerdeFieldContext::for_struct(container_attrs))?
        }
        Fields::Unnamed(fields) => {
            return Err(syn::Error::new_spanned(
                fields,
                "TierPatch only supports structs with named fields",
            ));
        }
        Fields::Unit => Vec::new(),
    };

    Ok(quote! {
        #(#field_tokens)*
    })
}