cgp_dispatch/providers/
match_with_handlers_ref.rs

1use core::marker::PhantomData;
2
3use cgp_core::field::FinalizeExtractResult;
4use cgp_core::prelude::*;
5use cgp_handler::{
6    Computer, ComputerComponent, Handler, HandlerComponent, TryComputer, TryComputerComponent,
7};
8
9use crate::DispatchMatchers;
10
11pub struct MatchWithHandlersRef<Handlers>(pub PhantomData<Handlers>);
12
13#[cgp_provider]
14impl<Context, Code, Input, Output, Handlers> Computer<Context, Code, &Input>
15    for MatchWithHandlersRef<Handlers>
16where
17    Input: HasExtractorRef,
18    DispatchMatchers<Handlers>: for<'b> Computer<
19        Context,
20        Code,
21        Input::ExtractorRef<'b>,
22        Output: FinalizeExtractResult<Output = Output>,
23    >,
24{
25    type Output = Output;
26
27    fn compute(context: &Context, code: PhantomData<Code>, input: &Input) -> Output {
28        DispatchMatchers::compute(context, code, input.extractor_ref()).finalize_extract_result()
29    }
30}
31
32#[cgp_provider]
33impl<Context, Code, Input, Output, Handlers> TryComputer<Context, Code, &Input>
34    for MatchWithHandlersRef<Handlers>
35where
36    Context: HasErrorType,
37    Input: HasExtractorRef,
38    DispatchMatchers<Handlers>: for<'b> TryComputer<
39        Context,
40        Code,
41        Input::ExtractorRef<'b>,
42        Output: FinalizeExtractResult<Output = Output>,
43    >,
44{
45    type Output = Output;
46
47    fn try_compute(
48        context: &Context,
49        code: PhantomData<Code>,
50        input: &Input,
51    ) -> Result<Output, Context::Error> {
52        Ok(
53            DispatchMatchers::try_compute(context, code, input.extractor_ref())?
54                .finalize_extract_result(),
55        )
56    }
57}
58
59#[cgp_provider]
60impl<Context, Code: Send, Input, Output, Handlers> Handler<Context, Code, &Input>
61    for MatchWithHandlersRef<Handlers>
62where
63    Context: HasAsyncErrorType,
64    Input: Send + Sync + HasExtractorRef,
65    DispatchMatchers<Handlers>: for<'b> Handler<
66        Context,
67        Code,
68        Input::ExtractorRef<'b>,
69        Output: FinalizeExtractResult<Output = Output>,
70    >,
71{
72    type Output = Output;
73
74    async fn handle(
75        _context: &Context,
76        code: PhantomData<Code>,
77        input: &Input,
78    ) -> Result<Output, Context::Error> {
79        Ok(
80            DispatchMatchers::handle(_context, code, input.extractor_ref())
81                .await?
82                .finalize_extract_result(),
83        )
84    }
85}