cgp_component_macro_lib/getter_component/
use_fields.rs

1use alloc::string::ToString;
2
3use proc_macro2::TokenStream;
4use quote::quote;
5use syn::{parse_quote, ItemImpl, ItemTrait};
6
7use crate::derive_component::component_spec::ComponentSpec;
8use crate::getter_component::getter_field::GetterField;
9use crate::getter_component::symbol::symbol_from_string;
10
11pub fn derive_use_fields_impl(
12    spec: &ComponentSpec,
13    consumer_trait: &ItemTrait,
14    fields: &[GetterField],
15) -> ItemImpl {
16    let context_type = &spec.context_type;
17    let provider_name = &spec.provider_name;
18
19    // FIXME: replace `Self` with `Context` inside super trait bound
20    let mut constraints = consumer_trait.supertraits.clone();
21
22    let mut methods: TokenStream = TokenStream::new();
23
24    for field in fields {
25        let field_name = &field.field_name;
26        let provider_type = &field.provider_type;
27        let field_symbol = symbol_from_string(&field.field_name.to_string());
28
29        if field.field_mut.is_none() {
30            constraints.push(parse_quote! {
31                HasField< #field_symbol, Value = #provider_type >
32            });
33
34            methods.extend(quote! {
35                fn #field_name( context: & #context_type ) -> & #provider_type {
36                    context.get_field( ::core::marker::PhantomData::< #field_symbol > )
37                }
38            });
39        } else {
40            constraints.push(parse_quote! {
41                HasFieldMut< #field_symbol, Value = #provider_type >
42            });
43
44            methods.extend(quote! {
45                fn #field_name( context: &mut #context_type ) -> &mut #provider_type {
46                    context.get_field_mut( ::core::marker::PhantomData::< #field_symbol > )
47                }
48            });
49        }
50    }
51
52    parse_quote! {
53        impl< #context_type > #provider_name < #context_type > for UseFields
54        where
55            #context_type: #constraints
56        {
57            #methods
58        }
59    }
60}