cgp-dispatch 0.7.0

Extensible data type dispatchers for CGP handlers
Documentation
use core::marker::PhantomData;

use cgp_core::field::traits::FinalizeExtractResult;
use cgp_core::prelude::*;
use cgp_handler::{AsyncComputer, AsyncComputerComponent, Computer, ComputerComponent};

use crate::DispatchMatchers;

pub struct MatchWithHandlersMut<Handlers>(pub PhantomData<Handlers>);

#[cgp_provider]
impl<'a, Context, Code, Input, Output, Remainder, Handlers> Computer<Context, Code, &'a mut Input>
    for MatchWithHandlersMut<Handlers>
where
    Input: HasExtractorMut,
    DispatchMatchers<Handlers>:
        Computer<Context, Code, Input::ExtractorMut<'a>, Output = Result<Output, Remainder>>,
    Remainder: FinalizeExtract,
{
    type Output = Output;

    fn compute(context: &Context, code: PhantomData<Code>, input: &'a mut Input) -> Output {
        DispatchMatchers::compute(context, code, input.extractor_mut()).finalize_extract_result()
    }
}

#[cgp_provider]
impl<'a, Context, Code, Input, Output, Remainder, Handlers>
    AsyncComputer<Context, Code, &'a mut Input> for MatchWithHandlersMut<Handlers>
where
    Input: HasExtractorMut,
    DispatchMatchers<Handlers>:
        AsyncComputer<Context, Code, Input::ExtractorMut<'a>, Output = Result<Output, Remainder>>,
    Remainder: FinalizeExtract,
{
    type Output = Output;

    async fn compute_async(
        context: &Context,
        code: PhantomData<Code>,
        input: &'a mut Input,
    ) -> Output {
        DispatchMatchers::compute_async(context, code, input.extractor_mut())
            .await
            .finalize_extract_result()
    }
}