cgp-handler 0.4.2-alpha

Generalized handler interfaces for functional programming
Documentation
use cgp_core::prelude::*;

use crate::{
    Computer, ComputerComponent, Handler, HandlerComponent, TryComputer, TryComputerComponent,
};

pub struct HandleFieldValue<Provider = UseContext>(pub PhantomData<Provider>);

#[cgp_provider]
impl<Context, Code, Tag, Input, Output, Provider> Computer<Context, Code, Field<Tag, Input>>
    for HandleFieldValue<Provider>
where
    Provider: Computer<Context, Code, Input, Output = Output>,
{
    type Output = Output;

    fn compute(
        context: &Context,
        tag: PhantomData<Code>,
        input: Field<Tag, Input>,
    ) -> Self::Output {
        Provider::compute(context, tag, input.value)
    }
}

#[cgp_provider]
impl<Context, Code, Tag, Input, Output, Provider> TryComputer<Context, Code, Field<Tag, Input>>
    for HandleFieldValue<Provider>
where
    Context: HasErrorType,
    Provider: TryComputer<Context, Code, Input, Output = Output>,
{
    type Output = Output;

    fn try_compute(
        context: &Context,
        tag: PhantomData<Code>,
        input: Field<Tag, Input>,
    ) -> Result<Self::Output, Context::Error> {
        Provider::try_compute(context, tag, input.value)
    }
}

#[cgp_provider]
impl<Context, Code: Send, Tag: Send, Input: Send, Provider>
    Handler<Context, Code, Field<Tag, Input>> for HandleFieldValue<Provider>
where
    Context: HasAsyncErrorType,
    Provider: Handler<Context, Code, Input>,
{
    type Output = Provider::Output;

    async fn handle(
        context: &Context,
        tag: PhantomData<Code>,
        input: Field<Tag, Input>,
    ) -> Result<Self::Output, Context::Error> {
        Provider::handle(context, tag, input.value).await
    }
}