Separated nonempty parser for punctuated
diff --git a/src/punctuated.rs b/src/punctuated.rs
index 1b40cac..de6d22d 100644
--- a/src/punctuated.rs
+++ b/src/punctuated.rs
@@ -39,6 +39,8 @@
#[cfg(feature = "parsing")]
use parse::{Parse, ParseStream, Result};
+#[cfg(feature = "parsing")]
+use token::Token;
/// A punctuated sequence of syntax tree nodes of type `T` separated by
/// punctuation of type `P`.
@@ -650,41 +652,68 @@
}
#[cfg(feature = "parsing")]
-impl<T, P> Punctuated<T, P>
-where
- T: Parse,
- P: Parse,
-{
- pub fn parse_terminated(input: ParseStream) -> Result<Self> {
+impl<T, P> Punctuated<T, P> {
+ pub fn parse_terminated(input: ParseStream) -> Result<Self>
+ where
+ T: Parse,
+ P: Parse,
+ {
Self::parse_terminated_with(input, T::parse)
}
-}
-#[cfg(feature = "parsing")]
-impl<T, P> Punctuated<T, P>
-where
- P: Parse,
-{
pub fn parse_terminated_with(
input: ParseStream,
parser: fn(ParseStream) -> Result<T>,
- ) -> Result<Self> {
- let mut res = Punctuated::new();
+ ) -> Result<Self>
+ where
+ P: Parse,
+ {
+ let mut punctuated = Punctuated::new();
loop {
if input.is_empty() {
break;
}
let value = parser(input)?;
- res.push_value(value);
+ punctuated.push_value(value);
if input.is_empty() {
break;
}
let punct = input.parse()?;
- res.push_punct(punct);
+ punctuated.push_punct(punct);
}
- Ok(res)
+ Ok(punctuated)
+ }
+
+ pub fn parse_separated_nonempty(input: ParseStream) -> Result<Self>
+ where
+ T: Parse,
+ P: Token + Parse,
+ {
+ Self::parse_separated_nonempty_with(input, T::parse)
+ }
+
+ pub fn parse_separated_nonempty_with(
+ input: ParseStream,
+ parser: fn(ParseStream) -> Result<T>,
+ ) -> Result<Self>
+ where
+ P: Token + Parse,
+ {
+ let mut punctuated = Punctuated::new();
+
+ loop {
+ let value = parser(input)?;
+ punctuated.push_value(value);
+ if !P::peek(&input.lookahead1()) {
+ break;
+ }
+ let punct = input.parse()?;
+ punctuated.push_punct(punct);
+ }
+
+ Ok(punctuated)
}
}