cgp_macro_lib/entrypoints/
derive_build_field.rs

1use proc_macro2::TokenStream;
2use quote::quote;
3use syn::{Ident, ItemStruct, parse2};
4
5use crate::derive_builder::{
6    derive_builder_struct, derive_finalize_build_impl, derive_has_builder_impl,
7    derive_has_field_impls, derive_into_builder_impl, derive_partial_data_impl,
8    derive_update_field_impls,
9};
10
11pub fn derive_build_field(body: TokenStream) -> syn::Result<TokenStream> {
12    let context_struct: ItemStruct = parse2(body)?;
13    derive_build_field_from_struct(&context_struct)
14}
15
16pub fn derive_build_field_from_struct(context_struct: &ItemStruct) -> syn::Result<TokenStream> {
17    let context_ident = &context_struct.ident;
18    let builder_ident = Ident::new(&format!("__Partial{context_ident}"), context_ident.span());
19
20    let builder_struct = derive_builder_struct(context_struct, &builder_ident)?;
21
22    let has_builder_impl = derive_has_builder_impl(context_struct, &builder_ident)?;
23
24    let into_builder_impl = derive_into_builder_impl(context_struct, &builder_ident)?;
25
26    let partial_data_impl = derive_partial_data_impl(context_struct, &builder_ident)?;
27
28    let update_field_impls = derive_update_field_impls(context_struct, &builder_ident)?;
29
30    let has_field_impls = derive_has_field_impls(context_struct, &builder_ident)?;
31
32    let finalize_build_impl = derive_finalize_build_impl(context_struct, &builder_ident)?;
33
34    let out = quote! {
35        #builder_struct
36
37        #has_builder_impl
38
39        #into_builder_impl
40
41        #partial_data_impl
42
43        #(#update_field_impls)*
44
45        #(#has_field_impls)*
46
47        #finalize_build_impl
48    };
49
50    Ok(out)
51}