cgp_handler/providers/
field.rs

1use cgp_core::prelude::*;
2
3use crate::{
4    Computer, ComputerComponent, Handler, HandlerComponent, TryComputer, TryComputerComponent,
5};
6
7pub struct HandleFieldValue<Provider = UseContext>(pub PhantomData<Provider>);
8
9#[cgp_provider]
10impl<Context, Code, Tag, Input, Output, Provider> Computer<Context, Code, Field<Tag, Input>>
11    for HandleFieldValue<Provider>
12where
13    Provider: Computer<Context, Code, Input, Output = Output>,
14{
15    type Output = Output;
16
17    fn compute(
18        context: &Context,
19        tag: PhantomData<Code>,
20        input: Field<Tag, Input>,
21    ) -> Self::Output {
22        Provider::compute(context, tag, input.value)
23    }
24}
25
26#[cgp_provider]
27impl<Context, Code, Tag, Input, Output, Provider> TryComputer<Context, Code, Field<Tag, Input>>
28    for HandleFieldValue<Provider>
29where
30    Context: HasErrorType,
31    Provider: TryComputer<Context, Code, Input, Output = Output>,
32{
33    type Output = Output;
34
35    fn try_compute(
36        context: &Context,
37        tag: PhantomData<Code>,
38        input: Field<Tag, Input>,
39    ) -> Result<Self::Output, Context::Error> {
40        Provider::try_compute(context, tag, input.value)
41    }
42}
43
44#[cgp_provider]
45impl<Context, Code: Send, Tag: Send, Input: Send, Provider>
46    Handler<Context, Code, Field<Tag, Input>> for HandleFieldValue<Provider>
47where
48    Context: HasAsyncErrorType,
49    Provider: Handler<Context, Code, Input>,
50{
51    type Output = Provider::Output;
52
53    async fn handle(
54        context: &Context,
55        tag: PhantomData<Code>,
56        input: Field<Tag, Input>,
57    ) -> Result<Self::Output, Context::Error> {
58        Provider::handle(context, tag, input.value).await
59    }
60}