cgp_field/impls/
chain.rs

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