use super::receiver::*;
use std::marker::*;
#[derive(Debug)]
pub struct VariantErrorReceiver<'inner, InnerT, ErrorT, ErrorVariantT> {
pub inner: &'inner mut InnerT,
error: PhantomData<ErrorT>,
error_variant: PhantomData<ErrorVariantT>,
}
impl<'outer, InnerT, ErrorT, ErrorVariantT> ErrorReceiver<ErrorVariantT>
for VariantErrorReceiver<'outer, InnerT, ErrorT, ErrorVariantT>
where
InnerT: ErrorReceiver<ErrorT>,
ErrorT: TryInto<ErrorVariantT>,
ErrorVariantT: Into<ErrorT>,
{
fn give_error(&mut self, error: ErrorVariantT) -> Result<(), ErrorVariantT> {
self.inner.give_error(error.into()).or_else(|error| match error.try_into() {
Ok(error) => Err(error),
Err(_) => Ok(()), })
}
}
pub trait ToVariantErrorReceiver<'inner, InnerT, ErrorT, ErrorVariantT> {
fn to_variant_error_receiver(&'inner mut self) -> VariantErrorReceiver<'inner, InnerT, ErrorT, ErrorVariantT>;
}
impl<'inner, InnerT, ErrorT, ErrorVariantT> ToVariantErrorReceiver<'inner, InnerT, ErrorT, ErrorVariantT> for InnerT
where
InnerT: ErrorReceiver<ErrorT>,
ErrorT: TryInto<ErrorVariantT>,
ErrorVariantT: Into<ErrorT>,
{
fn to_variant_error_receiver(&'inner mut self) -> VariantErrorReceiver<'inner, InnerT, ErrorT, ErrorVariantT> {
VariantErrorReceiver { inner: self, error: PhantomData, error_variant: PhantomData }
}
}