cgp_field/impls/
chain.rs

1use core::marker::PhantomData;
2
3use crate::traits::{FieldGetter, FieldMapper};
4use crate::types::{Cons, Nil};
5
6pub struct ChainGetters<Getters>(pub PhantomData<Getters>);
7
8impl<Context, Tag, Getter, RestGetters, ValueA, ValueB> FieldGetter<Context, Tag>
9    for ChainGetters<Cons<Getter, RestGetters>>
10where
11    Getter: FieldMapper<Context, Tag, Value = ValueA>,
12    ChainGetters<RestGetters>: FieldGetter<ValueA, Tag, Value = ValueB>,
13{
14    type Value = ValueB;
15
16    fn get_field(context: &Context, tag: PhantomData<Tag>) -> &ValueB {
17        Getter::map_field(context, tag, |value| {
18            <ChainGetters<RestGetters>>::get_field(value, tag)
19        })
20    }
21}
22
23impl<Context, Tag> FieldGetter<Context, Tag> for ChainGetters<Nil> {
24    type Value = Context;
25
26    fn get_field(context: &Context, _tag: PhantomData<Tag>) -> &Context {
27        context
28    }
29}