cgp_macro_lib/entrypoints/
derive_extract_field.rs

1use proc_macro2::TokenStream;
2use quote::quote;
3use syn::{Ident, ItemEnum, parse2};
4
5use crate::derive_extractor::{
6    derive_extract_field_impls, derive_extractor_enum, derive_extractor_enum_ref,
7    derive_finalize_extract_impl, derive_has_extractor_impl, derive_has_extractor_mut_impl,
8    derive_has_extractor_ref_impl, derive_partial_data_impl,
9};
10
11pub fn derive_extract_field(body: TokenStream) -> syn::Result<TokenStream> {
12    let context_enum: ItemEnum = parse2(body)?;
13    derive_extract_field_from_enum(&context_enum)
14}
15
16pub fn derive_extract_field_from_enum(context_enum: &ItemEnum) -> syn::Result<TokenStream> {
17    let context_ident = &context_enum.ident;
18
19    let extractor_ident = Ident::new(&format!("__Partial{context_ident}"), context_ident.span());
20    let extractor_enum = derive_extractor_enum(context_enum, &extractor_ident)?;
21
22    let extractor_ref_ident = Ident::new(
23        &format!("__PartialRef{context_ident}"),
24        context_ident.span(),
25    );
26    let extractor_ref_enum = derive_extractor_enum_ref(context_enum, &extractor_ref_ident)?;
27
28    let has_extractor_impl = derive_has_extractor_impl(context_enum, &extractor_ident)?;
29
30    let has_extractor_ref_impl = derive_has_extractor_ref_impl(context_enum, &extractor_ref_ident)?;
31
32    let has_extractor_mut_impl = derive_has_extractor_mut_impl(context_enum, &extractor_ref_ident)?;
33
34    let finalize_extract_impl =
35        derive_finalize_extract_impl(context_enum, &extractor_ident, false)?;
36
37    let finalize_extract_ref_impl =
38        derive_finalize_extract_impl(context_enum, &extractor_ref_ident, true)?;
39
40    let partial_data_impl = derive_partial_data_impl(context_enum, &extractor_ident, false)?;
41    let partial_ref_data_impl = derive_partial_data_impl(context_enum, &extractor_ref_ident, true)?;
42
43    let extractor_impls = derive_extract_field_impls(context_enum, &extractor_ident, false)?;
44    let extractor_ref_impls = derive_extract_field_impls(context_enum, &extractor_ref_ident, true)?;
45
46    let out = quote! {
47        #extractor_enum
48        #extractor_ref_enum
49
50        #partial_data_impl
51        #partial_ref_data_impl
52
53        #has_extractor_impl
54        #has_extractor_ref_impl
55        #has_extractor_mut_impl
56
57        #finalize_extract_impl
58        #finalize_extract_ref_impl
59
60        #(#extractor_impls)*
61        #(#extractor_ref_impls)*
62    };
63
64    Ok(out)
65}