cgp_field/impls/
use_field.rs1use 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}