cgp_dispatch/providers/
match_with_handlers_ref.rs1use 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}