cgp-dispatch 0.4.2-alpha

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

use crate::ExtractFieldAndHandle;

pub trait ToInputFieldHandlersRef<'a, Provider> {
    type Handlers;
}

impl<'a, Input, Provider, Handlers> ToInputFieldHandlersRef<'a, Provider> for Input
where
    Input: 'a + HasFieldsRef,
    Input::FieldsRef<'a>: ToFieldHandlers<Provider, Handlers = Handlers>,
{
    type Handlers = Handlers;
}

pub trait ToInputFieldHandlers<Provider> {
    type Handlers;
}

impl<Input, Fields, Provider> ToInputFieldHandlers<Provider> for Input
where
    Input: HasFields<Fields = Fields>,
    Fields: ToFieldHandlers<Provider>,
{
    type Handlers = Fields::Handlers;
}

pub trait ToFieldHandlers<Provider> {
    type Handlers;
}

impl<Tag, Value, RestFields, Provider> ToFieldHandlers<Provider>
    for Either<Field<Tag, Value>, RestFields>
where
    RestFields: ToFieldHandlers<Provider>,
{
    type Handlers = Cons<ExtractFieldAndHandle<Tag, Provider>, RestFields::Handlers>;
}

impl<Provider> ToFieldHandlers<Provider> for Void {
    type Handlers = Nil;
}