Skip to main content

cgp_handler/providers/
promote.rs

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