use crate::{
error::{Error, ErrorKind},
parser::*,
};
use std::marker::PhantomData;
#[derive(Clone)]
pub struct PBetween<L, P, R, A> {
l: L,
p: P,
r: R,
_marker: PhantomData<A>,
}
pub fn pbetween<L, P, R, A>(l: L, p: P, r: R) -> PBetween<L, P, R, A> {
PBetween {
l,
p,
r,
_marker: PhantomData,
}
}
impl<'a, K, O, L, P, R, A> ParserCore<'a, K, O> for PBetween<L, P, R, A>
where
K: PartialEq + Clone + 'a,
A: Clone + 'a,
O: Clone + 'a,
L: Parser<'a, K, A>,
P: Parser<'a, K, O>,
R: Parser<'a, K, A>,
{
fn parse(&self, i: PInput<'a, K>) -> Result<PSuccess<'a, K, O>, Error<'a, K>> {
let start = i.loc;
let PSuccess {
val: _,
rest: after_l,
} = self.l.parse(i)?;
let PSuccess {
val,
rest: after_main,
} = match self.p.parse(after_l) {
Ok(success) => success,
Err(Error {
mut kind,
span,
state,
}) => {
kind.push(ErrorKind::Custom(
"Failed parsing inside between parser.".to_string(),
));
return Err(Error { kind, span, state });
}
};
match self.r.parse(after_main) {
Ok(PSuccess {
val: _,
rest: after_r,
}) => Ok(PSuccess { val, rest: after_r }),
Err(Error {
mut kind,
span: _,
state,
}) => {
kind.push(ErrorKind::Custom(
"Missing end parsing between.".to_string(),
));
Err(Error {
kind,
span: (start, state.loc),
state,
})
}
}
}
}
impl<'a, K, O, L, P, R, A> Parser<'a, K, O> for PBetween<L, P, R, A>
where
K: PartialEq + Clone + 'a,
O: Clone + 'a,
A: Clone + 'a,
L: Parser<'a, K, A>,
P: Parser<'a, K, O>,
R: Parser<'a, K, A>,
{
}