use crate::Context;
use super::token::TokenIter;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum Recoverable {
Yes,
No,
}
pub trait IfRecoverable<T> {
fn if_recoverable(self, callback: impl FnMut() -> Recoverable) -> Result<T, Recoverable>;
}
impl<T> IfRecoverable<T> for Result<T, Recoverable> {
fn if_recoverable(self, mut callback: impl FnMut() -> Recoverable) -> Result<T, Recoverable> {
match self {
Self::Err(Recoverable::Yes) => Err(callback()),
res => res,
}
}
}
pub trait Parse<T> {
fn parse(&mut self, cx: &mut Context, tokens: &mut TokenIter) -> Result<T, Recoverable>;
}
impl<T, F: FnMut(&mut Context, &mut TokenIter) -> Result<T, Recoverable>> Parse<T> for F {
fn parse(&mut self, cx: &mut Context, tokens: &mut TokenIter) -> Result<T, Recoverable> {
self(cx, tokens)
}
}