cgp_field/impls/
use_field.rs

1use core::marker::PhantomData;
2
3use cgp_component::{IsProviderFor, WithProvider};
4use cgp_macro::cgp_provider;
5use cgp_type::{ProvideType, TypeComponent};
6
7use crate::traits::{FieldGetter, HasField, HasFieldMut, MutFieldGetter};
8
9pub struct UseField<Tag>(pub PhantomData<Tag>);
10
11pub type WithField<Tag> = WithProvider<UseField<Tag>>;
12
13#[cgp_provider(TypeComponent)]
14impl<Context, TypeTag, FieldTag, Field> ProvideType<Context, TypeTag> for UseField<FieldTag>
15where
16    Context: HasField<FieldTag, Value = Field>,
17{
18    type Type = Field;
19}
20
21impl<Context, OutTag, Tag, Value> FieldGetter<Context, OutTag> for UseField<Tag>
22where
23    Context: HasField<Tag, Value = Value>,
24{
25    type Value = Value;
26
27    fn get_field(context: &Context, _tag: PhantomData<OutTag>) -> &Value {
28        context.get_field(PhantomData)
29    }
30}
31
32impl<Context, OutTag, Tag, Value> MutFieldGetter<Context, OutTag> for UseField<Tag>
33where
34    Context: HasFieldMut<Tag, Value = Value>,
35{
36    fn get_field_mut(context: &mut Context, _tag: PhantomData<OutTag>) -> &mut Value {
37        context.get_field_mut(PhantomData)
38    }
39}