use cas_error::Error;
use crate::parser::{Parse, Parser};
use std::marker::PhantomData;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Delimited<D, T> {
pub values: Vec<T>,
delimiter: PhantomData<D>,
}
impl<'source, D, T> Parse<'source> for Delimited<D, T>
where
D: Parse<'source> + std::fmt::Debug,
T: Parse<'source> + std::fmt::Debug,
{
fn std_parse(
input: &mut Parser<'source>,
recoverable_errors: &mut Vec<Error>
) -> Result<Self, Vec<Error>> {
let mut values = Vec::new();
loop {
let Ok(value) = input.try_parse().forward_errors(recoverable_errors) else {
break;
};
values.push(value);
if input.try_parse::<D>().forward_errors(recoverable_errors).is_err() {
break;
}
}
Ok(Self { values, delimiter: PhantomData })
}
}