use crate::{error::Error, parser::*};
use std::marker::PhantomData;
#[derive(Clone)]
pub struct PPaddedBy<P, PD, A> {
p: P,
pad: PD,
_marker: PhantomData<A>,
}
pub fn ppadded<P, PD, A>(p: P, pad: PD) -> PPaddedBy<P, PD, A> {
PPaddedBy {
p,
pad,
_marker: PhantomData,
}
}
impl<'a, K, O, P, PD, A> ParserCore<'a, K, O> for PPaddedBy<P, PD, A>
where
K: PartialEq + Clone + 'a,
O: Clone + 'a,
A: Clone + 'a,
P: Parser<'a, K, O>,
PD: Parser<'a, K, A> + Clone,
{
fn parse(&self, i: PInput<'a, K>) -> Result<PSuccess<'a, K, O>, Error<'a, K>> {
let pad = &self.pad.clone().many();
let PSuccess {
rest: after_pad1, ..
} = pad.parse(i)?;
let PSuccess {
val,
rest: after_main,
} = self.p.parse(after_pad1)?;
let PSuccess {
rest: after_pad2, ..
} = pad.parse(after_main)?;
Ok(PSuccess {
val,
rest: after_pad2,
})
}
}
impl<'a, K, O, P, PD, B> Parser<'a, K, O> for PPaddedBy<P, PD, B>
where
K: PartialEq + Clone + 'a,
O: Clone + 'a,
B: Clone + 'a,
P: Parser<'a, K, O>,
PD: Parser<'a, K, B> + Clone,
{
}