1use crate::Context;
4
5use super::token::TokenIter;
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
9pub enum Recoverable {
10 Yes,
13
14 No,
16}
17
18pub trait IfRecoverable<T> {
20 fn if_recoverable(self, callback: impl FnMut() -> Recoverable) -> Result<T, Recoverable>;
23}
24
25impl<T> IfRecoverable<T> for Result<T, Recoverable> {
26 fn if_recoverable(self, mut callback: impl FnMut() -> Recoverable) -> Result<T, Recoverable> {
27 match self {
28 Self::Err(Recoverable::Yes) => Err(callback()),
29 res => res,
30 }
31 }
32}
33
34pub trait Parse<T> {
36 fn parse(&mut self, cx: &mut Context, tokens: &mut TokenIter) -> Result<T, Recoverable>;
38}
39
40impl<T, F: FnMut(&mut Context, &mut TokenIter) -> Result<T, Recoverable>> Parse<T> for F {
41 fn parse(&mut self, cx: &mut Context, tokens: &mut TokenIter) -> Result<T, Recoverable> {
42 self(cx, tokens)
43 }
44}