#![allow(clippy::module_name_repetitions)]
#[allow(clippy::wildcard_imports)]
use crate::*;
#[derive(Clone)]
pub struct Delimited<T, D> {
pub value: T,
pub delimiter: Option<D>,
}
impl<T: Parse, D: Parse> Parser for Delimited<T, D> {
fn parser(tokens: &mut TokenIter) -> Result<Self> {
Ok(Self {
value: T::parser(tokens)?,
delimiter: Option::<D>::parser(tokens)?,
})
}
}
impl<T: ToTokens, D: ToTokens> ToTokens for Delimited<T, D> {
fn to_tokens(&self, tokens: &mut TokenStream) {
self.value.to_tokens(tokens);
self.delimiter.to_tokens(tokens);
}
}
#[mutants::skip]
impl<T: std::fmt::Debug, D: std::fmt::Debug> std::fmt::Debug for Delimited<T, D> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.debug_struct(&format!(
"Delimited<{}, {}>",
std::any::type_name::<T>(),
std::any::type_name::<D>()
))
.field("value", &self.value)
.field("delimiter", &self.delimiter)
.finish()
}
}
pub type CommaDelimited<T> = Delimited<T, Comma>;
pub type ColonDelimited<T> = Delimited<T, Colon>;
pub type SemicolonDelimited<T> = Delimited<T, Semicolon>;
pub type DotDelimited<T> = Delimited<T, Dot>;
pub type PathSepDelimited<T> = Delimited<T, PathSep>;