use core::{
convert::Infallible,
ops::{
ControlFlow,
FromResidual,
Try,
},
};
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ParsedAux<Token, Context> {
Success(Token),
Failure(Context),
Error(Context),
}
impl<Token, Context> FromResidual for ParsedAux<Token, Context> {
fn from_residual(residual: ParsedAux<Infallible, Context>) -> Self {
match residual {
ParsedAux::Success(_success) => unreachable!(),
ParsedAux::Failure(context) => ParsedAux::Failure(context),
ParsedAux::Error(context) => ParsedAux::Error(context),
}
}
}
impl<Token, Context> FromResidual<Result<Infallible, Context>> for ParsedAux<Token, Context> {
fn from_residual(residual: Result<Infallible, Context>) -> Self {
match residual {
Ok(_success) => unreachable!(),
Err(context) => ParsedAux::Failure(context),
}
}
}
impl<Token, Context> Try for ParsedAux<Token, Context> {
type Output = Token;
type Residual = ParsedAux<Infallible, Context>;
fn from_output(output: Self::Output) -> Self {
Self::Success(output)
}
fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
match self {
Self::Success(token) => ControlFlow::Continue(token),
Self::Failure(context) => ControlFlow::Break(ParsedAux::Failure(context)),
Self::Error(context) => ControlFlow::Break(ParsedAux::Error(context)),
}
}
}