cgp-dispatch 0.7.0

Extensible data type dispatchers for CGP handlers
Documentation
use cgp_core::prelude::*;

use crate::{ExtractFieldAndHandle, ExtractFirstFieldAndHandle};

pub trait HasFieldHandlers<M> {
    type Handlers;
}

pub trait MapFieldHandler {
    type FieldHandler<Tag>;
}

impl<Context, Fields, M> HasFieldHandlers<M> for Context
where
    Context: HasFields<Fields = Fields>,
    Fields: ToFieldHandlers<M>,
{
    type Handlers = Fields::Handlers;
}

pub trait ToFieldHandlers<M> {
    type Handlers;
}

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

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

pub struct MapExtractFieldAndHandle<Provider>(pub PhantomData<Provider>);

impl<Provider> MapFieldHandler for MapExtractFieldAndHandle<Provider> {
    type FieldHandler<Tag> = ExtractFieldAndHandle<Tag, Provider>;
}

pub struct MapExtractFirstFieldAndHandle<Provider>(pub PhantomData<Provider>);

impl<Provider> MapFieldHandler for MapExtractFirstFieldAndHandle<Provider> {
    type FieldHandler<Tag> = ExtractFirstFieldAndHandle<Tag, Provider>;
}