cgp_handler/providers/
pipe.rs1use 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}