cgp_dispatch/providers/field_builders/
build_and_merge.rs1use 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}