1#![allow(clippy::module_name_repetitions)]
6
7#[allow(clippy::wildcard_imports)]
8use crate::*;
9
10#[derive(Clone)]
15pub struct Delimited<T, D> {
16 pub value: T,
18 pub delimiter: Option<D>,
20}
21
22impl<T: Parse, D: Parse> Parser for Delimited<T, D> {
23 fn parser(tokens: &mut TokenIter) -> Result<Self> {
24 Ok(Self {
25 value: T::parser(tokens)?,
26 delimiter: Option::<D>::parser(tokens)?,
27 })
28 }
29}
30
31impl<T: ToTokens, D: ToTokens> ToTokens for Delimited<T, D> {
32 fn to_tokens(&self, tokens: &mut TokenStream) {
33 self.value.to_tokens(tokens);
34 self.delimiter.to_tokens(tokens);
35 }
36}
37
38#[mutants::skip]
39impl<T: std::fmt::Debug, D: std::fmt::Debug> std::fmt::Debug for Delimited<T, D> {
40 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
41 f.debug_struct(&format!(
42 "Delimited<{}, {}>",
43 std::any::type_name::<T>(),
44 std::any::type_name::<D>()
45 ))
46 .field("value", &self.value)
47 .field("delimiter", &self.delimiter)
48 .finish()
49 }
50}
51
52pub type CommaDelimited<T> = Delimited<T, Comma>;
54pub type ColonDelimited<T> = Delimited<T, Colon>;
56pub type SemicolonDelimited<T> = Delimited<T, Semicolon>;
58pub type DotDelimited<T> = Delimited<T, Dot>;
60pub type PathSepDelimited<T> = Delimited<T, PathSep>;