Skip to main content

cgp_dispatch/providers/with_handlers/
build_with_handlers.rs

1use cgp_core::prelude::*;
2use cgp_handler::{
3    Computer, ComputerComponent, Handler, HandlerComponent, PipeHandlers, TryComputer,
4    TryComputerComponent,
5};
6
7pub struct BuildWithHandlers<Output, Handlers>(pub PhantomData<(Output, Handlers)>);
8
9#[cgp_provider]
10impl<Context, Code, Input, Output, Builder, Handlers, Res> Computer<Context, Code, Input>
11    for BuildWithHandlers<Output, Handlers>
12where
13    Output: HasBuilder<Builder = Builder>,
14    PipeHandlers<Handlers>: Computer<Context, Code, Builder, Output = Res>,
15    Res: FinalizeBuild<Target = Output>,
16{
17    type Output = Output;
18
19    fn compute(context: &Context, code: PhantomData<Code>, _input: Input) -> Self::Output {
20        PipeHandlers::compute(context, code, Output::builder()).finalize_build()
21    }
22}
23
24#[cgp_provider]
25impl<Context, Code, Input, Output, Builder, Handlers, Res> TryComputer<Context, Code, Input>
26    for BuildWithHandlers<Output, Handlers>
27where
28    Context: HasErrorType,
29    Output: HasBuilder<Builder = Builder>,
30    PipeHandlers<Handlers>: TryComputer<Context, Code, Builder, Output = Res>,
31    Res: FinalizeBuild<Target = Output>,
32{
33    type Output = Output;
34
35    fn try_compute(
36        context: &Context,
37        code: PhantomData<Code>,
38        _input: Input,
39    ) -> Result<Self::Output, Context::Error> {
40        Ok(PipeHandlers::try_compute(context, code, Output::builder())?.finalize_build())
41    }
42}
43
44#[cgp_provider]
45impl<Context, Code, Input, Output, Builder, Handlers, Res> Handler<Context, Code, Input>
46    for BuildWithHandlers<Output, Handlers>
47where
48    Context: HasErrorType,
49    Output: HasBuilder<Builder = Builder>,
50    PipeHandlers<Handlers>: Handler<Context, Code, Builder, Output = Res>,
51    Res: FinalizeBuild<Target = Output>,
52{
53    type Output = Output;
54
55    async fn handle(
56        context: &Context,
57        code: PhantomData<Code>,
58        _input: Input,
59    ) -> Result<Self::Output, Context::Error> {
60        Ok(PipeHandlers::handle(context, code, Output::builder())
61            .await?
62            .finalize_build())
63    }
64}