tier-derive 0.1.17

Derive macros for tier Rust configuration metadata
Documentation
use quote::quote;
use syn::Type;

use crate::ty::{option_inner_type, patch_inner_type};

pub(super) fn generate_nested_patch_tokens(
    field_ty: &Type,
    field_access: proc_macro2::TokenStream,
    path_expr: proc_macro2::TokenStream,
) -> proc_macro2::TokenStream {
    if option_inner_type(field_ty).is_some() {
        quote! {
            if let ::std::option::Option::Some(value) = #field_access {
                let __tier_path = #path_expr;
                ::tier::TierPatch::write_layer(value, __tier_builder, &__tier_path)?;
            }
        }
    } else if patch_inner_type(field_ty).is_some() {
        quote! {
            if let ::std::option::Option::Some(value) = #field_access.as_ref() {
                let __tier_path = #path_expr;
                ::tier::TierPatch::write_layer(value, __tier_builder, &__tier_path)?;
            }
        }
    } else {
        quote! {
            {
                let __tier_path = #path_expr;
                ::tier::TierPatch::write_layer(#field_access, __tier_builder, &__tier_path)?;
            }
        }
    }
}

pub(super) fn generate_leaf_patch_tokens(
    field_ty: &Type,
    field_access: proc_macro2::TokenStream,
    path_expr: proc_macro2::TokenStream,
) -> proc_macro2::TokenStream {
    if option_inner_type(field_ty).is_some() {
        quote! {
            if let ::std::option::Option::Some(value) = #field_access {
                let __tier_path = #path_expr;
                __tier_builder.insert_serialized(&__tier_path, value)?;
            }
        }
    } else if patch_inner_type(field_ty).is_some() {
        quote! {
            if let ::std::option::Option::Some(value) = #field_access.as_ref() {
                let __tier_path = #path_expr;
                __tier_builder.insert_serialized(&__tier_path, value)?;
            }
        }
    } else {
        quote! {
            {
                let __tier_path = #path_expr;
                __tier_builder.insert_serialized(&__tier_path, #field_access)?;
            }
        }
    }
}