Skip to main content

cgp_dispatch/providers/field_builders/
build_and_set_field.rs

1use 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}