Skip to main content

cgp_dispatch/providers/field_builders/
build_and_merge.rs

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