1use crate::{Parse, ParseResult, ParseToEnd, Parser, ParserConsumed};
2
3use sway_ast::punctuated::Punctuated;
4
5impl<T, P> ParseToEnd for Punctuated<T, P>
6where
7 T: Parse,
8 P: Parse,
9{
10 fn parse_to_end<'a, 'e>(
11 mut parser: Parser<'a, '_>,
12 ) -> ParseResult<(Punctuated<T, P>, ParserConsumed<'a>)> {
13 let mut value_separator_pairs = Vec::new();
14 loop {
15 if let Some(consumed) = parser.check_empty() {
16 let punctuated = Punctuated {
17 value_separator_pairs,
18 final_value_opt: None,
19 };
20 return Ok((punctuated, consumed));
21 }
22 let value = parser.parse()?;
23 if let Some(consumed) = parser.check_empty() {
24 let punctuated = Punctuated {
25 value_separator_pairs,
26 final_value_opt: Some(Box::new(value)),
27 };
28 return Ok((punctuated, consumed));
29 }
30 let separator = parser.parse()?;
31 value_separator_pairs.push((value, separator));
32 }
33 }
34}