use crate::{error::Error, parser::*};
use std::marker::PhantomData;
#[derive(Clone)]
pub struct PDelim1<P1, P2, A> {
p: P1,
delim: P2,
_marker: PhantomData<A>,
}
pub fn pdelim1<P1, P2, A>(p: P1, delim: P2) -> PDelim1<P1, P2, A> {
PDelim1 {
p,
delim,
_marker: PhantomData,
}
}
impl<'a, K, O, P, PDelim_, B> ParserCore<'a, K, Vec<O>> for PDelim1<P, PDelim_, B>
where
K: PartialEq + Clone + 'a,
O: Clone + 'a,
B: Clone + 'a,
P: Parser<'a, K, O>,
PDelim_: Parser<'a, K, B>,
{
fn parse(&self, i: PInput<'a, K>) -> Result<PSuccess<'a, K, Vec<O>>, Error<'a, K>> {
let mut vals = vec![];
let mut input = i;
loop {
match self.p.parse(input.clone()) {
Ok(PSuccess { val, rest }) => {
vals.push(val);
input = rest;
match self.delim.parse(input.clone()) {
Ok(PSuccess { val: _, rest }) => {
input = rest;
continue;
}
Err(_) => {
return Ok(PSuccess {
val: vals,
rest: input,
});
}
}
}
Err(Error { kind, span, state }) => {
if !vals.is_empty() {
return Ok(PSuccess {
val: vals,
rest: state,
});
} else {
return Err(Error { kind, span, state });
}
}
}
}
}
}
impl<'a, K, O, P, PDelim_, B> Parser<'a, K, Vec<O>> for PDelim1<P, PDelim_, B>
where
K: PartialEq + Clone + 'a,
O: Clone + 'a,
B: Clone + 'a,
P: Parser<'a, K, O>,
PDelim_: Parser<'a, K, B>,
{
}