cgp_component_macro_lib/getter_component/
use_fields.rs1use 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 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}