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