cgp_handler/providers/
pipe.rs

1use core::marker::PhantomData;
2
3use cgp_core::prelude::*;
4
5use crate::components::*;
6
7pub struct PipeHandlers<Providers>(pub PhantomData<Providers>);
8
9#[cgp_provider]
10impl<Context, Code, Input, Output, CurrentProvider, RestProviders> Handler<Context, Code, Input>
11    for PipeHandlers<Cons<CurrentProvider, RestProviders>>
12where
13    Context: HasAsyncErrorType,
14    CurrentProvider: Handler<Context, Code, Input>,
15    PipeHandlers<RestProviders>: Handler<Context, Code, CurrentProvider::Output, Output = Output>,
16    Code: Send,
17    Input: Send,
18    Output: Send,
19{
20    type Output = Output;
21
22    async fn handle(
23        context: &Context,
24        tag: PhantomData<Code>,
25        input: Input,
26    ) -> Result<Output, Context::Error> {
27        let intermediate = CurrentProvider::handle(context, tag, input).await?;
28        <PipeHandlers<RestProviders>>::handle(context, tag, intermediate).await
29    }
30}
31
32#[cgp_provider]
33impl<Context, Tag, Input> Handler<Context, Tag, Input> for PipeHandlers<Nil>
34where
35    Context: HasAsyncErrorType,
36    Tag: Send,
37    Input: Send,
38{
39    type Output = Input;
40
41    async fn handle(
42        _context: &Context,
43        _tag: PhantomData<Tag>,
44        input: Input,
45    ) -> Result<Input, Context::Error> {
46        Ok(input)
47    }
48}
49
50#[cgp_provider]
51impl<Context, Tag, Input, Output, CurrentProvider, RestProviders> Computer<Context, Tag, Input>
52    for PipeHandlers<Cons<CurrentProvider, RestProviders>>
53where
54    CurrentProvider: Computer<Context, Tag, Input>,
55    PipeHandlers<RestProviders>: Computer<Context, Tag, CurrentProvider::Output, Output = Output>,
56{
57    type Output = Output;
58
59    fn compute(context: &Context, tag: PhantomData<Tag>, input: Input) -> Output {
60        let intermediate = CurrentProvider::compute(context, tag, input);
61        <PipeHandlers<RestProviders>>::compute(context, tag, intermediate)
62    }
63}
64
65#[cgp_provider]
66impl<Context, Tag, Input> Computer<Context, Tag, Input> for PipeHandlers<Nil> {
67    type Output = Input;
68
69    fn compute(_context: &Context, _tag: PhantomData<Tag>, input: Input) -> Input {
70        input
71    }
72}