use crate::prelude::*;
use crate::{Error, Result, Robj};
impl<'a, L, R> TryFrom<&'a Robj> for Either<L, R>
where
L: TryFrom<&'a Robj, Error = Error>,
R: TryFrom<&'a Robj, Error = Error>,
{
type Error = Error;
fn try_from(value: &'a Robj) -> Result<Self> {
match L::try_from(value) {
Ok(left) => Ok(Left(left)),
Err(left_err) => match R::try_from(value) {
Ok(right) => Ok(Right(right)),
Err(right_err) => Err(Error::EitherError(Box::new(left_err), Box::new(right_err))),
},
}
}
}
impl<L, R> TryFrom<Robj> for Either<L, R>
where
for<'a> Either<L, R>: TryFrom<&'a Robj, Error = Error>,
{
type Error = Error;
fn try_from(value: Robj) -> Result<Self> {
(&value).try_into()
}
}
impl<L, R> From<Either<L, R>> for Robj
where
Robj: From<L> + From<R>,
{
fn from(value: Either<L, R>) -> Self {
match value {
Left(left) => Robj::from(left),
Right(right) => Robj::from(right),
}
}
}