1 //! Combinators applying their child parser multiple times
2 
3 use crate::combinator::trace;
4 use crate::error::ErrMode;
5 use crate::error::ErrorKind;
6 use crate::error::ParserError;
7 use crate::stream::Accumulate;
8 use crate::stream::Range;
9 use crate::stream::Stream;
10 use crate::PResult;
11 use crate::Parser;
12 
13 /// [`Accumulate`] the output of a parser into a container, like `Vec`
14 ///
15 /// This stops before `n` when the parser returns [`ErrMode::Backtrack`]. To instead chain an error up, see
16 /// [`cut_err`][crate::combinator::cut_err].
17 ///
18 /// # Arguments
19 /// * `m` The minimum number of iterations.
20 /// * `n` The maximum number of iterations.
21 /// * `f` The parser to apply.
22 ///
23 /// To recognize a series of tokens, [`Accumulate`] into a `()` and then [`Parser::recognize`].
24 ///
25 /// **Warning:** If the parser passed to `repeat` accepts empty inputs
26 /// (like `alpha0` or `digit0`), `repeat` will return an error,
27 /// to prevent going into an infinite loop.
28 ///
29 /// # Example
30 ///
31 /// Zero or more repetitions:
32 /// ```rust
33 /// # #[cfg(feature = "std")] {
34 /// # use winnow::{error::ErrMode, error::ErrorKind, error::Needed};
35 /// # use winnow::prelude::*;
36 /// use winnow::combinator::repeat;
37 /// use winnow::token::tag;
38 ///
39 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
40 ///   repeat(0.., "abc").parse_peek(s)
41 /// }
42 ///
43 /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
44 /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
45 /// assert_eq!(parser("123123"), Ok(("123123", vec![])));
46 /// assert_eq!(parser(""), Ok(("", vec![])));
47 /// # }
48 /// ```
49 ///
50 /// One or more repetitions:
51 /// ```rust
52 /// # #[cfg(feature = "std")] {
53 /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
54 /// # use winnow::prelude::*;
55 /// use winnow::combinator::repeat;
56 /// use winnow::token::tag;
57 ///
58 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
59 ///   repeat(1.., "abc").parse_peek(s)
60 /// }
61 ///
62 /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
63 /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
64 /// assert_eq!(parser("123123"), Err(ErrMode::Backtrack(InputError::new("123123", ErrorKind::Tag))));
65 /// assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Tag))));
66 /// # }
67 /// ```
68 ///
69 /// Fixed number of repetitions:
70 /// ```rust
71 /// # #[cfg(feature = "std")] {
72 /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
73 /// # use winnow::prelude::*;
74 /// use winnow::combinator::repeat;
75 /// use winnow::token::tag;
76 ///
77 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
78 ///   repeat(2, "abc").parse_peek(s)
79 /// }
80 ///
81 /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
82 /// assert_eq!(parser("abc123"), Err(ErrMode::Backtrack(InputError::new("123", ErrorKind::Tag))));
83 /// assert_eq!(parser("123123"), Err(ErrMode::Backtrack(InputError::new("123123", ErrorKind::Tag))));
84 /// assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Tag))));
85 /// assert_eq!(parser("abcabcabc"), Ok(("abc", vec!["abc", "abc"])));
86 /// # }
87 /// ```
88 ///
89 /// Arbitrary repetitions:
90 /// ```rust
91 /// # #[cfg(feature = "std")] {
92 /// # use winnow::{error::ErrMode, error::ErrorKind, error::Needed};
93 /// # use winnow::prelude::*;
94 /// use winnow::combinator::repeat;
95 /// use winnow::token::tag;
96 ///
97 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
98 ///   repeat(0..=2, "abc").parse_peek(s)
99 /// }
100 ///
101 /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
102 /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
103 /// assert_eq!(parser("123123"), Ok(("123123", vec![])));
104 /// assert_eq!(parser(""), Ok(("", vec![])));
105 /// assert_eq!(parser("abcabcabc"), Ok(("abc", vec!["abc", "abc"])));
106 /// # }
107 /// ```
108 #[doc(alias = "many0")]
109 #[doc(alias = "count")]
110 #[doc(alias = "many0_count")]
111 #[doc(alias = "many1")]
112 #[doc(alias = "many1_count")]
113 #[doc(alias = "many_m_n")]
114 #[doc(alias = "repeated")]
115 #[doc(alias = "skip_many")]
116 #[doc(alias = "skip_many1")]
117 #[inline(always)]
repeat<I, O, C, E, P>(range: impl Into<Range>, parser: P) -> Repeat<P, I, O, C, E> where I: Stream, C: Accumulate<O>, P: Parser<I, O, E>, E: ParserError<I>,118 pub fn repeat<I, O, C, E, P>(range: impl Into<Range>, parser: P) -> Repeat<P, I, O, C, E>
119 where
120     I: Stream,
121     C: Accumulate<O>,
122     P: Parser<I, O, E>,
123     E: ParserError<I>,
124 {
125     Repeat {
126         range: range.into(),
127         parser,
128         i: Default::default(),
129         o: Default::default(),
130         c: Default::default(),
131         e: Default::default(),
132     }
133 }
134 
135 /// Implementation of [`repeat`]
136 #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))]
137 pub struct Repeat<P, I, O, C, E>
138 where
139     P: Parser<I, O, E>,
140     I: Stream,
141     C: Accumulate<O>,
142     E: ParserError<I>,
143 {
144     range: Range,
145     parser: P,
146     i: core::marker::PhantomData<I>,
147     o: core::marker::PhantomData<O>,
148     c: core::marker::PhantomData<C>,
149     e: core::marker::PhantomData<E>,
150 }
151 
152 impl<P, I, O, E> Repeat<P, I, O, (), E>
153 where
154     P: Parser<I, O, E>,
155     I: Stream,
156     E: ParserError<I>,
157 {
158     /// Repeats the embedded parser, calling `g` to gather the results
159     ///
160     /// This stops before `n` when the parser returns [`ErrMode::Backtrack`]. To instead chain an error up, see
161     /// [`cut_err`][crate::combinator::cut_err].
162     ///
163     /// # Arguments
164     /// * `init` A function returning the initial value.
165     /// * `g` The function that combines a result of `f` with
166     ///       the current accumulator.
167     ///
168     /// **Warning:** If the parser passed to `fold` accepts empty inputs
169     /// (like `alpha0` or `digit0`), `fold_repeat` will return an error,
170     /// to prevent going into an infinite loop.
171     ///
172     /// # Example
173     ///
174     /// Zero or more repetitions:
175     /// ```rust
176     /// # use winnow::{error::ErrMode, error::ErrorKind, error::Needed};
177     /// # use winnow::prelude::*;
178     /// use winnow::combinator::repeat;
179     /// use winnow::token::tag;
180     ///
181     /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
182     ///   repeat(
183     ///     0..,
184     ///     "abc"
185     ///   ).fold(
186     ///     Vec::new,
187     ///     |mut acc: Vec<_>, item| {
188     ///       acc.push(item);
189     ///       acc
190     ///     }
191     ///   ).parse_peek(s)
192     /// }
193     ///
194     /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
195     /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
196     /// assert_eq!(parser("123123"), Ok(("123123", vec![])));
197     /// assert_eq!(parser(""), Ok(("", vec![])));
198     /// ```
199     ///
200     /// One or more repetitions:
201     /// ```rust
202     /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
203     /// # use winnow::prelude::*;
204     /// use winnow::combinator::repeat;
205     /// use winnow::token::tag;
206     ///
207     /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
208     ///   repeat(
209     ///     1..,
210     ///     "abc",
211     ///   ).fold(
212     ///     Vec::new,
213     ///     |mut acc: Vec<_>, item| {
214     ///       acc.push(item);
215     ///       acc
216     ///     }
217     ///   ).parse_peek(s)
218     /// }
219     ///
220     /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
221     /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
222     /// assert_eq!(parser("123123"), Err(ErrMode::Backtrack(InputError::new("123123", ErrorKind::Many))));
223     /// assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Many))));
224     /// ```
225     ///
226     /// Arbitrary number of repetitions:
227     /// ```rust
228     /// # use winnow::{error::ErrMode, error::ErrorKind, error::Needed};
229     /// # use winnow::prelude::*;
230     /// use winnow::combinator::repeat;
231     /// use winnow::token::tag;
232     ///
233     /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
234     ///   repeat(
235     ///     0..=2,
236     ///     "abc",
237     ///   ).fold(
238     ///     Vec::new,
239     ///     |mut acc: Vec<_>, item| {
240     ///       acc.push(item);
241     ///       acc
242     ///     }
243     ///   ).parse_peek(s)
244     /// }
245     ///
246     /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
247     /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
248     /// assert_eq!(parser("123123"), Ok(("123123", vec![])));
249     /// assert_eq!(parser(""), Ok(("", vec![])));
250     /// assert_eq!(parser("abcabcabc"), Ok(("abc", vec!["abc", "abc"])));
251     /// ```
252     #[doc(alias = "fold_many0")]
253     #[doc(alias = "fold_many1")]
254     #[doc(alias = "fold_many_m_n")]
255     #[doc(alias = "fold_repeat")]
256     #[inline(always)]
fold<H, G, R>(mut self, mut init: H, mut g: G) -> impl Parser<I, R, E> where G: FnMut(R, O) -> R, H: FnMut() -> R,257     pub fn fold<H, G, R>(mut self, mut init: H, mut g: G) -> impl Parser<I, R, E>
258     where
259         G: FnMut(R, O) -> R,
260         H: FnMut() -> R,
261     {
262         let Range {
263             start_inclusive,
264             end_inclusive,
265         } = self.range;
266         trace("repeat_fold", move |i: &mut I| {
267             match (start_inclusive, end_inclusive) {
268                 (0, None) => fold_repeat0_(&mut self.parser, &mut init, &mut g, i),
269                 (1, None) => fold_repeat1_(&mut self.parser, &mut init, &mut g, i),
270                 (start, end) => fold_repeat_m_n_(
271                     start,
272                     end.unwrap_or(usize::MAX),
273                     &mut self.parser,
274                     &mut init,
275                     &mut g,
276                     i,
277                 ),
278             }
279         })
280     }
281 }
282 
283 impl<P, I, O, C, E> Parser<I, C, E> for Repeat<P, I, O, C, E>
284 where
285     P: Parser<I, O, E>,
286     I: Stream,
287     C: Accumulate<O>,
288     E: ParserError<I>,
289 {
290     #[inline(always)]
parse_next(&mut self, i: &mut I) -> PResult<C, E>291     fn parse_next(&mut self, i: &mut I) -> PResult<C, E> {
292         let Range {
293             start_inclusive,
294             end_inclusive,
295         } = self.range;
296         trace("repeat", move |i: &mut I| {
297             match (start_inclusive, end_inclusive) {
298                 (0, None) => repeat0_(&mut self.parser, i),
299                 (1, None) => repeat1_(&mut self.parser, i),
300                 (start, end) if Some(start) == end => repeat_n_(start, &mut self.parser, i),
301                 (start, end) => repeat_m_n_(start, end.unwrap_or(usize::MAX), &mut self.parser, i),
302             }
303         })
304         .parse_next(i)
305     }
306 }
307 
repeat0_<I, O, C, E, F>(f: &mut F, i: &mut I) -> PResult<C, E> where I: Stream, C: Accumulate<O>, F: Parser<I, O, E>, E: ParserError<I>,308 fn repeat0_<I, O, C, E, F>(f: &mut F, i: &mut I) -> PResult<C, E>
309 where
310     I: Stream,
311     C: Accumulate<O>,
312     F: Parser<I, O, E>,
313     E: ParserError<I>,
314 {
315     let mut acc = C::initial(None);
316     loop {
317         let start = i.checkpoint();
318         let len = i.eof_offset();
319         match f.parse_next(i) {
320             Err(ErrMode::Backtrack(_)) => {
321                 i.reset(start);
322                 return Ok(acc);
323             }
324             Err(e) => return Err(e),
325             Ok(o) => {
326                 // infinite loop check: the parser must always consume
327                 if i.eof_offset() == len {
328                     return Err(ErrMode::assert(i, "`repeat` parsers must always consume"));
329                 }
330 
331                 acc.accumulate(o);
332             }
333         }
334     }
335 }
336 
repeat1_<I, O, C, E, F>(f: &mut F, i: &mut I) -> PResult<C, E> where I: Stream, C: Accumulate<O>, F: Parser<I, O, E>, E: ParserError<I>,337 fn repeat1_<I, O, C, E, F>(f: &mut F, i: &mut I) -> PResult<C, E>
338 where
339     I: Stream,
340     C: Accumulate<O>,
341     F: Parser<I, O, E>,
342     E: ParserError<I>,
343 {
344     match f.parse_next(i) {
345         Err(e) => Err(e.append(i, ErrorKind::Many)),
346         Ok(o) => {
347             let mut acc = C::initial(None);
348             acc.accumulate(o);
349 
350             loop {
351                 let start = i.checkpoint();
352                 let len = i.eof_offset();
353                 match f.parse_next(i) {
354                     Err(ErrMode::Backtrack(_)) => {
355                         i.reset(start);
356                         return Ok(acc);
357                     }
358                     Err(e) => return Err(e),
359                     Ok(o) => {
360                         // infinite loop check: the parser must always consume
361                         if i.eof_offset() == len {
362                             return Err(ErrMode::assert(i, "`repeat` parsers must always consume"));
363                         }
364 
365                         acc.accumulate(o);
366                     }
367                 }
368             }
369         }
370     }
371 }
372 
repeat_n_<I, O, C, E, F>(count: usize, f: &mut F, i: &mut I) -> PResult<C, E> where I: Stream, C: Accumulate<O>, F: Parser<I, O, E>, E: ParserError<I>,373 fn repeat_n_<I, O, C, E, F>(count: usize, f: &mut F, i: &mut I) -> PResult<C, E>
374 where
375     I: Stream,
376     C: Accumulate<O>,
377     F: Parser<I, O, E>,
378     E: ParserError<I>,
379 {
380     let mut res = C::initial(Some(count));
381 
382     for _ in 0..count {
383         match f.parse_next(i) {
384             Ok(o) => {
385                 res.accumulate(o);
386             }
387             Err(e) => {
388                 return Err(e.append(i, ErrorKind::Many));
389             }
390         }
391     }
392 
393     Ok(res)
394 }
395 
repeat_m_n_<I, O, C, E, F>(min: usize, max: usize, parse: &mut F, input: &mut I) -> PResult<C, E> where I: Stream, C: Accumulate<O>, F: Parser<I, O, E>, E: ParserError<I>,396 fn repeat_m_n_<I, O, C, E, F>(min: usize, max: usize, parse: &mut F, input: &mut I) -> PResult<C, E>
397 where
398     I: Stream,
399     C: Accumulate<O>,
400     F: Parser<I, O, E>,
401     E: ParserError<I>,
402 {
403     if min > max {
404         return Err(ErrMode::Cut(E::from_error_kind(input, ErrorKind::Many)));
405     }
406 
407     let mut res = C::initial(Some(min));
408     for count in 0..max {
409         let start = input.checkpoint();
410         let len = input.eof_offset();
411         match parse.parse_next(input) {
412             Ok(value) => {
413                 // infinite loop check: the parser must always consume
414                 if input.eof_offset() == len {
415                     return Err(ErrMode::assert(
416                         input,
417                         "`repeat` parsers must always consume",
418                     ));
419                 }
420 
421                 res.accumulate(value);
422             }
423             Err(ErrMode::Backtrack(e)) => {
424                 if count < min {
425                     return Err(ErrMode::Backtrack(e.append(input, ErrorKind::Many)));
426                 } else {
427                     input.reset(start);
428                     return Ok(res);
429                 }
430             }
431             Err(e) => {
432                 return Err(e);
433             }
434         }
435     }
436 
437     Ok(res)
438 }
439 
440 /// [`Accumulate`] the output of parser `f` into a container, like `Vec`, until the parser `g`
441 /// produces a result.
442 ///
443 /// Returns a tuple of the results of `f` in a `Vec` and the result of `g`.
444 ///
445 /// `f` keeps going so long as `g` produces [`ErrMode::Backtrack`]. To instead chain an error up, see [`cut_err`][crate::combinator::cut_err].
446 ///
447 /// To recognize a series of tokens, [`Accumulate`] into a `()` and then [`Parser::recognize`].
448 ///
449 /// # Example
450 ///
451 /// ```rust
452 /// # #[cfg(feature = "std")] {
453 /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
454 /// # use winnow::prelude::*;
455 /// use winnow::combinator::repeat_till;
456 /// use winnow::token::tag;
457 ///
458 /// fn parser(s: &str) -> IResult<&str, (Vec<&str>, &str)> {
459 ///   repeat_till(0.., "abc", "end").parse_peek(s)
460 /// };
461 ///
462 /// assert_eq!(parser("abcabcend"), Ok(("", (vec!["abc", "abc"], "end"))));
463 /// assert_eq!(parser("abc123end"), Err(ErrMode::Backtrack(InputError::new("123end", ErrorKind::Tag))));
464 /// assert_eq!(parser("123123end"), Err(ErrMode::Backtrack(InputError::new("123123end", ErrorKind::Tag))));
465 /// assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Tag))));
466 /// assert_eq!(parser("abcendefg"), Ok(("efg", (vec!["abc"], "end"))));
467 /// # }
468 /// ```
469 #[doc(alias = "many_till0")]
repeat_till<I, O, C, P, E, F, G>( range: impl Into<Range>, mut f: F, mut g: G, ) -> impl Parser<I, (C, P), E> where I: Stream, C: Accumulate<O>, F: Parser<I, O, E>, G: Parser<I, P, E>, E: ParserError<I>,470 pub fn repeat_till<I, O, C, P, E, F, G>(
471     range: impl Into<Range>,
472     mut f: F,
473     mut g: G,
474 ) -> impl Parser<I, (C, P), E>
475 where
476     I: Stream,
477     C: Accumulate<O>,
478     F: Parser<I, O, E>,
479     G: Parser<I, P, E>,
480     E: ParserError<I>,
481 {
482     let Range {
483         start_inclusive,
484         end_inclusive,
485     } = range.into();
486     trace("repeat_till", move |i: &mut I| {
487         match (start_inclusive, end_inclusive) {
488             (0, None) => repeat_till0_(&mut f, &mut g, i),
489             (start, end) => repeat_till_m_n_(start, end.unwrap_or(usize::MAX), &mut f, &mut g, i),
490         }
491     })
492 }
493 
494 /// Deprecated, replaced with [`repeat_till`]
495 #[deprecated(since = "0.5.35", note = "Replaced with `repeat_till`")]
496 #[inline(always)]
repeat_till0<I, O, C, P, E, F, G>(f: F, g: G) -> impl Parser<I, (C, P), E> where I: Stream, C: Accumulate<O>, F: Parser<I, O, E>, G: Parser<I, P, E>, E: ParserError<I>,497 pub fn repeat_till0<I, O, C, P, E, F, G>(f: F, g: G) -> impl Parser<I, (C, P), E>
498 where
499     I: Stream,
500     C: Accumulate<O>,
501     F: Parser<I, O, E>,
502     G: Parser<I, P, E>,
503     E: ParserError<I>,
504 {
505     repeat_till(0.., f, g)
506 }
507 
repeat_till0_<I, O, C, P, E, F, G>(f: &mut F, g: &mut G, i: &mut I) -> PResult<(C, P), E> where I: Stream, C: Accumulate<O>, F: Parser<I, O, E>, G: Parser<I, P, E>, E: ParserError<I>,508 fn repeat_till0_<I, O, C, P, E, F, G>(f: &mut F, g: &mut G, i: &mut I) -> PResult<(C, P), E>
509 where
510     I: Stream,
511     C: Accumulate<O>,
512     F: Parser<I, O, E>,
513     G: Parser<I, P, E>,
514     E: ParserError<I>,
515 {
516     let mut res = C::initial(None);
517     loop {
518         let start = i.checkpoint();
519         let len = i.eof_offset();
520         match g.parse_next(i) {
521             Ok(o) => return Ok((res, o)),
522             Err(ErrMode::Backtrack(_)) => {
523                 i.reset(start);
524                 match f.parse_next(i) {
525                     Err(e) => return Err(e.append(i, ErrorKind::Many)),
526                     Ok(o) => {
527                         // infinite loop check: the parser must always consume
528                         if i.eof_offset() == len {
529                             return Err(ErrMode::assert(i, "`repeat` parsers must always consume"));
530                         }
531 
532                         res.accumulate(o);
533                     }
534                 }
535             }
536             Err(e) => return Err(e),
537         }
538     }
539 }
540 
repeat_till_m_n_<I, O, C, P, E, F, G>( min: usize, max: usize, f: &mut F, g: &mut G, i: &mut I, ) -> PResult<(C, P), E> where I: Stream, C: Accumulate<O>, F: Parser<I, O, E>, G: Parser<I, P, E>, E: ParserError<I>,541 fn repeat_till_m_n_<I, O, C, P, E, F, G>(
542     min: usize,
543     max: usize,
544     f: &mut F,
545     g: &mut G,
546     i: &mut I,
547 ) -> PResult<(C, P), E>
548 where
549     I: Stream,
550     C: Accumulate<O>,
551     F: Parser<I, O, E>,
552     G: Parser<I, P, E>,
553     E: ParserError<I>,
554 {
555     if min > max {
556         return Err(ErrMode::Cut(E::from_error_kind(i, ErrorKind::Many)));
557     }
558 
559     let mut res = C::initial(Some(min));
560     for _ in 0..min {
561         match f.parse_next(i) {
562             Ok(o) => {
563                 res.accumulate(o);
564             }
565             Err(e) => {
566                 return Err(e.append(i, ErrorKind::Many));
567             }
568         }
569     }
570     for count in min..=max {
571         let start = i.checkpoint();
572         let len = i.eof_offset();
573         match g.parse_next(i) {
574             Ok(o) => return Ok((res, o)),
575             Err(ErrMode::Backtrack(err)) => {
576                 if count == max {
577                     return Err(ErrMode::Backtrack(err));
578                 }
579                 i.reset(start);
580                 match f.parse_next(i) {
581                     Err(e) => {
582                         return Err(e.append(i, ErrorKind::Many));
583                     }
584                     Ok(o) => {
585                         // infinite loop check: the parser must always consume
586                         if i.eof_offset() == len {
587                             return Err(ErrMode::assert(i, "`repeat` parsers must always consume"));
588                         }
589 
590                         res.accumulate(o);
591                     }
592                 }
593             }
594             Err(e) => return Err(e),
595         }
596     }
597     unreachable!()
598 }
599 
600 /// [`Accumulate`] the output of a parser, interleaved with `sep`
601 ///
602 /// This stops when either parser returns [`ErrMode::Backtrack`]. To instead chain an error up, see
603 /// [`cut_err`][crate::combinator::cut_err].
604 ///
605 /// # Arguments
606 /// * `range` The minimum and maximum number of iterations.
607 /// * `parser` The parser that parses the elements of the list.
608 /// * `sep` The parser that parses the separator between list elements.
609 ///
610 /// **Warning:** If the separator parser accepts empty inputs
611 /// (like `alpha0` or `digit0`), `separated` will return an error,
612 /// to prevent going into an infinite loop.
613 ///
614 /// # Example
615 ///
616 /// Zero or more repetitions:
617 /// ```rust
618 /// # #[cfg(feature = "std")] {
619 /// # use winnow::{error::ErrMode, error::ErrorKind, error::Needed};
620 /// # use winnow::prelude::*;
621 /// use winnow::combinator::separated;
622 /// use winnow::token::tag;
623 ///
624 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
625 ///   separated(0.., "abc", "|").parse_peek(s)
626 /// }
627 ///
628 /// assert_eq!(parser("abc|abc|abc"), Ok(("", vec!["abc", "abc", "abc"])));
629 /// assert_eq!(parser("abc123abc"), Ok(("123abc", vec!["abc"])));
630 /// assert_eq!(parser("abc|def"), Ok(("|def", vec!["abc"])));
631 /// assert_eq!(parser(""), Ok(("", vec![])));
632 /// assert_eq!(parser("def|abc"), Ok(("def|abc", vec![])));
633 /// # }
634 /// ```
635 ///
636 /// One or more repetitions:
637 /// ```rust
638 /// # #[cfg(feature = "std")] {
639 /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
640 /// # use winnow::prelude::*;
641 /// use winnow::combinator::separated;
642 /// use winnow::token::tag;
643 ///
644 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
645 ///   separated(1.., "abc", "|").parse_peek(s)
646 /// }
647 ///
648 /// assert_eq!(parser("abc|abc|abc"), Ok(("", vec!["abc", "abc", "abc"])));
649 /// assert_eq!(parser("abc123abc"), Ok(("123abc", vec!["abc"])));
650 /// assert_eq!(parser("abc|def"), Ok(("|def", vec!["abc"])));
651 /// assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Tag))));
652 /// assert_eq!(parser("def|abc"), Err(ErrMode::Backtrack(InputError::new("def|abc", ErrorKind::Tag))));
653 /// # }
654 /// ```
655 ///
656 /// Fixed number of repetitions:
657 /// ```rust
658 /// # #[cfg(feature = "std")] {
659 /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
660 /// # use winnow::prelude::*;
661 /// use winnow::combinator::separated;
662 /// use winnow::token::tag;
663 ///
664 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
665 ///   separated(2, "abc", "|").parse_peek(s)
666 /// }
667 ///
668 /// assert_eq!(parser("abc|abc|abc"), Ok(("|abc", vec!["abc", "abc"])));
669 /// assert_eq!(parser("abc123abc"), Err(ErrMode::Backtrack(InputError::new("123abc", ErrorKind::Tag))));
670 /// assert_eq!(parser("abc|def"), Err(ErrMode::Backtrack(InputError::new("def", ErrorKind::Tag))));
671 /// assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Tag))));
672 /// assert_eq!(parser("def|abc"), Err(ErrMode::Backtrack(InputError::new("def|abc", ErrorKind::Tag))));
673 /// # }
674 /// ```
675 ///
676 /// Arbitrary repetitions:
677 /// ```rust
678 /// # #[cfg(feature = "std")] {
679 /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
680 /// # use winnow::prelude::*;
681 /// use winnow::combinator::separated;
682 /// use winnow::token::tag;
683 ///
684 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
685 ///   separated(0..=2, "abc", "|").parse_peek(s)
686 /// }
687 ///
688 /// assert_eq!(parser("abc|abc|abc"), Ok(("|abc", vec!["abc", "abc"])));
689 /// assert_eq!(parser("abc123abc"), Ok(("123abc", vec!["abc"])));
690 /// assert_eq!(parser("abc|def"), Ok(("|def", vec!["abc"])));
691 /// assert_eq!(parser(""), Ok(("", vec![])));
692 /// assert_eq!(parser("def|abc"), Ok(("def|abc", vec![])));
693 /// # }
694 /// ```
695 #[doc(alias = "sep_by")]
696 #[doc(alias = "sep_by1")]
697 #[doc(alias = "separated_list0")]
698 #[doc(alias = "separated_list1")]
699 #[doc(alias = "separated_m_n")]
700 #[inline(always)]
separated<I, O, C, O2, E, P, S>( range: impl Into<Range>, mut parser: P, mut separator: S, ) -> impl Parser<I, C, E> where I: Stream, C: Accumulate<O>, P: Parser<I, O, E>, S: Parser<I, O2, E>, E: ParserError<I>,701 pub fn separated<I, O, C, O2, E, P, S>(
702     range: impl Into<Range>,
703     mut parser: P,
704     mut separator: S,
705 ) -> impl Parser<I, C, E>
706 where
707     I: Stream,
708     C: Accumulate<O>,
709     P: Parser<I, O, E>,
710     S: Parser<I, O2, E>,
711     E: ParserError<I>,
712 {
713     let Range {
714         start_inclusive,
715         end_inclusive,
716     } = range.into();
717     trace("separated", move |input: &mut I| {
718         match (start_inclusive, end_inclusive) {
719             (0, None) => separated0_(&mut parser, &mut separator, input),
720             (1, None) => separated1_(&mut parser, &mut separator, input),
721             (start, end) if Some(start) == end => {
722                 separated_n_(start, &mut parser, &mut separator, input)
723             }
724             (start, end) => separated_m_n_(
725                 start,
726                 end.unwrap_or(usize::MAX),
727                 &mut parser,
728                 &mut separator,
729                 input,
730             ),
731         }
732     })
733 }
734 
735 /// [`Accumulate`] the output of a parser, interleaved with `sep`
736 ///
737 /// This stops when either parser returns [`ErrMode::Backtrack`]. To instead chain an error up, see
738 /// [`cut_err`][crate::combinator::cut_err].
739 ///
740 /// # Arguments
741 /// * `parser` Parses the elements of the list.
742 /// * `sep` Parses the separator between list elements.
743 ///
744 /// # Example
745 ///
746 /// ```rust
747 /// # #[cfg(feature = "std")] {
748 /// # use winnow::{error::ErrMode, error::ErrorKind, error::Needed};
749 /// # use winnow::prelude::*;
750 /// use winnow::combinator::separated0;
751 /// use winnow::token::tag;
752 ///
753 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
754 ///   separated0("abc", "|").parse_peek(s)
755 /// }
756 ///
757 /// assert_eq!(parser("abc|abc|abc"), Ok(("", vec!["abc", "abc", "abc"])));
758 /// assert_eq!(parser("abc123abc"), Ok(("123abc", vec!["abc"])));
759 /// assert_eq!(parser("abc|def"), Ok(("|def", vec!["abc"])));
760 /// assert_eq!(parser(""), Ok(("", vec![])));
761 /// assert_eq!(parser("def|abc"), Ok(("def|abc", vec![])));
762 /// # }
763 /// ```
764 #[doc(alias = "sep_by")]
765 #[doc(alias = "separated_list0")]
766 #[deprecated(since = "0.5.19", note = "Replaced with `combinator::separated`")]
separated0<I, O, C, O2, E, P, S>(mut parser: P, mut sep: S) -> impl Parser<I, C, E> where I: Stream, C: Accumulate<O>, P: Parser<I, O, E>, S: Parser<I, O2, E>, E: ParserError<I>,767 pub fn separated0<I, O, C, O2, E, P, S>(mut parser: P, mut sep: S) -> impl Parser<I, C, E>
768 where
769     I: Stream,
770     C: Accumulate<O>,
771     P: Parser<I, O, E>,
772     S: Parser<I, O2, E>,
773     E: ParserError<I>,
774 {
775     trace("separated0", move |i: &mut I| {
776         separated0_(&mut parser, &mut sep, i)
777     })
778 }
779 
separated0_<I, O, C, O2, E, P, S>( parser: &mut P, separator: &mut S, input: &mut I, ) -> PResult<C, E> where I: Stream, C: Accumulate<O>, P: Parser<I, O, E>, S: Parser<I, O2, E>, E: ParserError<I>,780 fn separated0_<I, O, C, O2, E, P, S>(
781     parser: &mut P,
782     separator: &mut S,
783     input: &mut I,
784 ) -> PResult<C, E>
785 where
786     I: Stream,
787     C: Accumulate<O>,
788     P: Parser<I, O, E>,
789     S: Parser<I, O2, E>,
790     E: ParserError<I>,
791 {
792     let mut acc = C::initial(None);
793 
794     let start = input.checkpoint();
795     match parser.parse_next(input) {
796         Err(ErrMode::Backtrack(_)) => {
797             input.reset(start);
798             return Ok(acc);
799         }
800         Err(e) => return Err(e),
801         Ok(o) => {
802             acc.accumulate(o);
803         }
804     }
805 
806     loop {
807         let start = input.checkpoint();
808         let len = input.eof_offset();
809         match separator.parse_next(input) {
810             Err(ErrMode::Backtrack(_)) => {
811                 input.reset(start);
812                 return Ok(acc);
813             }
814             Err(e) => return Err(e),
815             Ok(_) => {
816                 // infinite loop check
817                 if input.eof_offset() == len {
818                     return Err(ErrMode::assert(
819                         input,
820                         "`separated` separator parser must always consume",
821                     ));
822                 }
823 
824                 match parser.parse_next(input) {
825                     Err(ErrMode::Backtrack(_)) => {
826                         input.reset(start);
827                         return Ok(acc);
828                     }
829                     Err(e) => return Err(e),
830                     Ok(o) => {
831                         acc.accumulate(o);
832                     }
833                 }
834             }
835         }
836     }
837 }
838 
839 /// [`Accumulate`] the output of a parser, interleaved with `sep`
840 ///
841 /// Fails if the element parser does not produce at least one element.$
842 ///
843 /// This stops when either parser returns [`ErrMode::Backtrack`]. To instead chain an error up, see
844 /// [`cut_err`][crate::combinator::cut_err].
845 ///
846 /// # Arguments
847 /// * `sep` Parses the separator between list elements.
848 /// * `f` Parses the elements of the list.
849 ///
850 /// # Example
851 ///
852 /// ```rust
853 /// # #[cfg(feature = "std")] {
854 /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
855 /// # use winnow::prelude::*;
856 /// use winnow::combinator::separated1;
857 /// use winnow::token::tag;
858 ///
859 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
860 ///   separated1("abc", "|").parse_peek(s)
861 /// }
862 ///
863 /// assert_eq!(parser("abc|abc|abc"), Ok(("", vec!["abc", "abc", "abc"])));
864 /// assert_eq!(parser("abc123abc"), Ok(("123abc", vec!["abc"])));
865 /// assert_eq!(parser("abc|def"), Ok(("|def", vec!["abc"])));
866 /// assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Tag))));
867 /// assert_eq!(parser("def|abc"), Err(ErrMode::Backtrack(InputError::new("def|abc", ErrorKind::Tag))));
868 /// # }
869 /// ```
870 #[doc(alias = "sep_by1")]
871 #[doc(alias = "separated_list1")]
872 #[deprecated(since = "0.5.19", note = "Replaced with `combinator::separated`")]
separated1<I, O, C, O2, E, P, S>(mut parser: P, mut sep: S) -> impl Parser<I, C, E> where I: Stream, C: Accumulate<O>, P: Parser<I, O, E>, S: Parser<I, O2, E>, E: ParserError<I>,873 pub fn separated1<I, O, C, O2, E, P, S>(mut parser: P, mut sep: S) -> impl Parser<I, C, E>
874 where
875     I: Stream,
876     C: Accumulate<O>,
877     P: Parser<I, O, E>,
878     S: Parser<I, O2, E>,
879     E: ParserError<I>,
880 {
881     trace("separated1", move |i: &mut I| {
882         separated1_(&mut parser, &mut sep, i)
883     })
884 }
885 
separated1_<I, O, C, O2, E, P, S>( parser: &mut P, separator: &mut S, input: &mut I, ) -> PResult<C, E> where I: Stream, C: Accumulate<O>, P: Parser<I, O, E>, S: Parser<I, O2, E>, E: ParserError<I>,886 fn separated1_<I, O, C, O2, E, P, S>(
887     parser: &mut P,
888     separator: &mut S,
889     input: &mut I,
890 ) -> PResult<C, E>
891 where
892     I: Stream,
893     C: Accumulate<O>,
894     P: Parser<I, O, E>,
895     S: Parser<I, O2, E>,
896     E: ParserError<I>,
897 {
898     let mut acc = C::initial(None);
899 
900     // Parse the first element
901     match parser.parse_next(input) {
902         Err(e) => return Err(e),
903         Ok(o) => {
904             acc.accumulate(o);
905         }
906     }
907 
908     loop {
909         let start = input.checkpoint();
910         let len = input.eof_offset();
911         match separator.parse_next(input) {
912             Err(ErrMode::Backtrack(_)) => {
913                 input.reset(start);
914                 return Ok(acc);
915             }
916             Err(e) => return Err(e),
917             Ok(_) => {
918                 // infinite loop check
919                 if input.eof_offset() == len {
920                     return Err(ErrMode::assert(
921                         input,
922                         "`separated` separator parser must always consume",
923                     ));
924                 }
925 
926                 match parser.parse_next(input) {
927                     Err(ErrMode::Backtrack(_)) => {
928                         input.reset(start);
929                         return Ok(acc);
930                     }
931                     Err(e) => return Err(e),
932                     Ok(o) => {
933                         acc.accumulate(o);
934                     }
935                 }
936             }
937         }
938     }
939 }
940 
separated_n_<I, O, C, O2, E, P, S>( count: usize, parser: &mut P, separator: &mut S, input: &mut I, ) -> PResult<C, E> where I: Stream, C: Accumulate<O>, P: Parser<I, O, E>, S: Parser<I, O2, E>, E: ParserError<I>,941 fn separated_n_<I, O, C, O2, E, P, S>(
942     count: usize,
943     parser: &mut P,
944     separator: &mut S,
945     input: &mut I,
946 ) -> PResult<C, E>
947 where
948     I: Stream,
949     C: Accumulate<O>,
950     P: Parser<I, O, E>,
951     S: Parser<I, O2, E>,
952     E: ParserError<I>,
953 {
954     let mut acc = C::initial(Some(count));
955 
956     if count == 0 {
957         return Ok(acc);
958     }
959 
960     match parser.parse_next(input) {
961         Err(e) => {
962             return Err(e.append(input, ErrorKind::Many));
963         }
964         Ok(o) => {
965             acc.accumulate(o);
966         }
967     }
968 
969     for _ in 1..count {
970         let len = input.eof_offset();
971         match separator.parse_next(input) {
972             Err(e) => {
973                 return Err(e.append(input, ErrorKind::Many));
974             }
975             Ok(_) => {
976                 // infinite loop check
977                 if input.eof_offset() == len {
978                     return Err(ErrMode::assert(
979                         input,
980                         "`separated` separator parser must always consume",
981                     ));
982                 }
983 
984                 match parser.parse_next(input) {
985                     Err(e) => {
986                         return Err(e.append(input, ErrorKind::Many));
987                     }
988                     Ok(o) => {
989                         acc.accumulate(o);
990                     }
991                 }
992             }
993         }
994     }
995 
996     Ok(acc)
997 }
998 
separated_m_n_<I, O, C, O2, E, P, S>( min: usize, max: usize, parser: &mut P, separator: &mut S, input: &mut I, ) -> PResult<C, E> where I: Stream, C: Accumulate<O>, P: Parser<I, O, E>, S: Parser<I, O2, E>, E: ParserError<I>,999 fn separated_m_n_<I, O, C, O2, E, P, S>(
1000     min: usize,
1001     max: usize,
1002     parser: &mut P,
1003     separator: &mut S,
1004     input: &mut I,
1005 ) -> PResult<C, E>
1006 where
1007     I: Stream,
1008     C: Accumulate<O>,
1009     P: Parser<I, O, E>,
1010     S: Parser<I, O2, E>,
1011     E: ParserError<I>,
1012 {
1013     if min > max {
1014         return Err(ErrMode::Cut(E::from_error_kind(input, ErrorKind::Many)));
1015     }
1016 
1017     let mut acc = C::initial(Some(min));
1018 
1019     let start = input.checkpoint();
1020     match parser.parse_next(input) {
1021         Err(ErrMode::Backtrack(e)) => {
1022             if min == 0 {
1023                 input.reset(start);
1024                 return Ok(acc);
1025             } else {
1026                 return Err(ErrMode::Backtrack(e.append(input, ErrorKind::Many)));
1027             }
1028         }
1029         Err(e) => return Err(e),
1030         Ok(o) => {
1031             acc.accumulate(o);
1032         }
1033     }
1034 
1035     for index in 1..max {
1036         let start = input.checkpoint();
1037         let len = input.eof_offset();
1038         match separator.parse_next(input) {
1039             Err(ErrMode::Backtrack(e)) => {
1040                 if index < min {
1041                     return Err(ErrMode::Backtrack(e.append(input, ErrorKind::Many)));
1042                 } else {
1043                     input.reset(start);
1044                     return Ok(acc);
1045                 }
1046             }
1047             Err(e) => {
1048                 return Err(e);
1049             }
1050             Ok(_) => {
1051                 // infinite loop check
1052                 if input.eof_offset() == len {
1053                     return Err(ErrMode::assert(
1054                         input,
1055                         "`separated` separator parser must always consume",
1056                     ));
1057                 }
1058 
1059                 match parser.parse_next(input) {
1060                     Err(ErrMode::Backtrack(e)) => {
1061                         if index < min {
1062                             return Err(ErrMode::Backtrack(e.append(input, ErrorKind::Many)));
1063                         } else {
1064                             input.reset(start);
1065                             return Ok(acc);
1066                         }
1067                     }
1068                     Err(e) => {
1069                         return Err(e);
1070                     }
1071                     Ok(o) => {
1072                         acc.accumulate(o);
1073                     }
1074                 }
1075             }
1076         }
1077     }
1078 
1079     Ok(acc)
1080 }
1081 
1082 /// Alternates between two parsers, merging the results (left associative)
1083 ///
1084 /// This stops when either parser returns [`ErrMode::Backtrack`]. To instead chain an error up, see
1085 /// [`cut_err`][crate::combinator::cut_err].
1086 ///
1087 /// # Example
1088 ///
1089 /// ```rust
1090 /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
1091 /// # use winnow::prelude::*;
1092 /// use winnow::combinator::separated_foldl1;
1093 /// use winnow::ascii::dec_int;
1094 ///
1095 /// fn parser(s: &str) -> IResult<&str, i32> {
1096 ///   separated_foldl1(dec_int, "-", |l, _, r| l - r).parse_peek(s)
1097 /// }
1098 ///
1099 /// assert_eq!(parser("9-3-5"), Ok(("", 1)));
1100 /// assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Slice))));
1101 /// assert_eq!(parser("def|abc"), Err(ErrMode::Backtrack(InputError::new("def|abc", ErrorKind::Slice))));
1102 /// ```
separated_foldl1<I, O, O2, E, P, S, Op>( mut parser: P, mut sep: S, mut op: Op, ) -> impl Parser<I, O, E> where I: Stream, P: Parser<I, O, E>, S: Parser<I, O2, E>, E: ParserError<I>, Op: FnMut(O, O2, O) -> O,1103 pub fn separated_foldl1<I, O, O2, E, P, S, Op>(
1104     mut parser: P,
1105     mut sep: S,
1106     mut op: Op,
1107 ) -> impl Parser<I, O, E>
1108 where
1109     I: Stream,
1110     P: Parser<I, O, E>,
1111     S: Parser<I, O2, E>,
1112     E: ParserError<I>,
1113     Op: FnMut(O, O2, O) -> O,
1114 {
1115     trace("separated_foldl1", move |i: &mut I| {
1116         let mut ol = parser.parse_next(i)?;
1117 
1118         loop {
1119             let start = i.checkpoint();
1120             let len = i.eof_offset();
1121             match sep.parse_next(i) {
1122                 Err(ErrMode::Backtrack(_)) => {
1123                     i.reset(start);
1124                     return Ok(ol);
1125                 }
1126                 Err(e) => return Err(e),
1127                 Ok(s) => {
1128                     // infinite loop check: the parser must always consume
1129                     if i.eof_offset() == len {
1130                         return Err(ErrMode::assert(i, "`repeat` parsers must always consume"));
1131                     }
1132 
1133                     match parser.parse_next(i) {
1134                         Err(ErrMode::Backtrack(_)) => {
1135                             i.reset(start);
1136                             return Ok(ol);
1137                         }
1138                         Err(e) => return Err(e),
1139                         Ok(or) => {
1140                             ol = op(ol, s, or);
1141                         }
1142                     }
1143                 }
1144             }
1145         }
1146     })
1147 }
1148 
1149 /// Alternates between two parsers, merging the results (right associative)
1150 ///
1151 /// This stops when either parser returns [`ErrMode::Backtrack`]. To instead chain an error up, see
1152 /// [`cut_err`][crate::combinator::cut_err].
1153 ///
1154 /// # Example
1155 ///
1156 /// ```
1157 /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
1158 /// # use winnow::prelude::*;
1159 /// use winnow::combinator::separated_foldr1;
1160 /// use winnow::ascii::dec_uint;
1161 ///
1162 /// fn parser(s: &str) -> IResult<&str, u32> {
1163 ///   separated_foldr1(dec_uint, "^", |l: u32, _, r: u32| l.pow(r)).parse_peek(s)
1164 /// }
1165 ///
1166 /// assert_eq!(parser("2^3^2"), Ok(("", 512)));
1167 /// assert_eq!(parser("2"), Ok(("", 2)));
1168 /// assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Slice))));
1169 /// assert_eq!(parser("def|abc"), Err(ErrMode::Backtrack(InputError::new("def|abc", ErrorKind::Slice))));
1170 /// ```
1171 #[cfg(feature = "alloc")]
separated_foldr1<I, O, O2, E, P, S, Op>( mut parser: P, mut sep: S, mut op: Op, ) -> impl Parser<I, O, E> where I: Stream, P: Parser<I, O, E>, S: Parser<I, O2, E>, E: ParserError<I>, Op: FnMut(O, O2, O) -> O,1172 pub fn separated_foldr1<I, O, O2, E, P, S, Op>(
1173     mut parser: P,
1174     mut sep: S,
1175     mut op: Op,
1176 ) -> impl Parser<I, O, E>
1177 where
1178     I: Stream,
1179     P: Parser<I, O, E>,
1180     S: Parser<I, O2, E>,
1181     E: ParserError<I>,
1182     Op: FnMut(O, O2, O) -> O,
1183 {
1184     trace("separated_foldr1", move |i: &mut I| {
1185         let ol = parser.parse_next(i)?;
1186         let all: crate::lib::std::vec::Vec<(O2, O)> =
1187             repeat(0.., (sep.by_ref(), parser.by_ref())).parse_next(i)?;
1188         if let Some((s, or)) = all
1189             .into_iter()
1190             .rev()
1191             .reduce(|(sr, or), (sl, ol)| (sl, op(ol, sr, or)))
1192         {
1193             let merged = op(ol, s, or);
1194             Ok(merged)
1195         } else {
1196             Ok(ol)
1197         }
1198     })
1199 }
1200 
1201 /// Repeats the embedded parser, filling the given slice with results.
1202 ///
1203 /// This parser fails if the input runs out before the given slice is full.
1204 ///
1205 /// # Arguments
1206 /// * `f` The parser to apply.
1207 /// * `buf` The slice to fill
1208 ///
1209 /// # Example
1210 ///
1211 /// ```rust
1212 /// # use winnow::{error::ErrMode, error::{InputError, ErrorKind}, error::Needed};
1213 /// # use winnow::prelude::*;
1214 /// use winnow::combinator::fill;
1215 /// use winnow::token::tag;
1216 ///
1217 /// fn parser(s: &str) -> IResult<&str, [&str; 2]> {
1218 ///   let mut buf = ["", ""];
1219 ///   let (rest, ()) = fill("abc", &mut buf).parse_peek(s)?;
1220 ///   Ok((rest, buf))
1221 /// }
1222 ///
1223 /// assert_eq!(parser("abcabc"), Ok(("", ["abc", "abc"])));
1224 /// assert_eq!(parser("abc123"), Err(ErrMode::Backtrack(InputError::new("123", ErrorKind::Tag))));
1225 /// assert_eq!(parser("123123"), Err(ErrMode::Backtrack(InputError::new("123123", ErrorKind::Tag))));
1226 /// assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Tag))));
1227 /// assert_eq!(parser("abcabcabc"), Ok(("abc", ["abc", "abc"])));
1228 /// ```
fill<'a, I, O, E, F>(mut f: F, buf: &'a mut [O]) -> impl Parser<I, (), E> + 'a where I: Stream + 'a, F: Parser<I, O, E> + 'a, E: ParserError<I> + 'a,1229 pub fn fill<'a, I, O, E, F>(mut f: F, buf: &'a mut [O]) -> impl Parser<I, (), E> + 'a
1230 where
1231     I: Stream + 'a,
1232     F: Parser<I, O, E> + 'a,
1233     E: ParserError<I> + 'a,
1234 {
1235     trace("fill", move |i: &mut I| {
1236         for elem in buf.iter_mut() {
1237             match f.parse_next(i) {
1238                 Ok(o) => {
1239                     *elem = o;
1240                 }
1241                 Err(e) => {
1242                     return Err(e.append(i, ErrorKind::Many));
1243                 }
1244             }
1245         }
1246 
1247         Ok(())
1248     })
1249 }
1250 
1251 /// Deprecated, replaced with [`Repeat::fold`]
1252 #[deprecated(since = "0.5.36", note = "Replaced with `repeat(...).fold(...)`")]
1253 #[inline(always)]
fold_repeat<I, O, E, F, G, H, R>( range: impl Into<Range>, f: F, init: H, g: G, ) -> impl Parser<I, R, E> where I: Stream, F: Parser<I, O, E>, G: FnMut(R, O) -> R, H: FnMut() -> R, E: ParserError<I>,1254 pub fn fold_repeat<I, O, E, F, G, H, R>(
1255     range: impl Into<Range>,
1256     f: F,
1257     init: H,
1258     g: G,
1259 ) -> impl Parser<I, R, E>
1260 where
1261     I: Stream,
1262     F: Parser<I, O, E>,
1263     G: FnMut(R, O) -> R,
1264     H: FnMut() -> R,
1265     E: ParserError<I>,
1266 {
1267     repeat(range, f).fold(init, g)
1268 }
1269 
fold_repeat0_<I, O, E, F, G, H, R>( f: &mut F, init: &mut H, g: &mut G, input: &mut I, ) -> PResult<R, E> where I: Stream, F: Parser<I, O, E>, G: FnMut(R, O) -> R, H: FnMut() -> R, E: ParserError<I>,1270 fn fold_repeat0_<I, O, E, F, G, H, R>(
1271     f: &mut F,
1272     init: &mut H,
1273     g: &mut G,
1274     input: &mut I,
1275 ) -> PResult<R, E>
1276 where
1277     I: Stream,
1278     F: Parser<I, O, E>,
1279     G: FnMut(R, O) -> R,
1280     H: FnMut() -> R,
1281     E: ParserError<I>,
1282 {
1283     let mut res = init();
1284 
1285     loop {
1286         let start = input.checkpoint();
1287         let len = input.eof_offset();
1288         match f.parse_next(input) {
1289             Ok(o) => {
1290                 // infinite loop check: the parser must always consume
1291                 if input.eof_offset() == len {
1292                     return Err(ErrMode::assert(
1293                         input,
1294                         "`repeat` parsers must always consume",
1295                     ));
1296                 }
1297 
1298                 res = g(res, o);
1299             }
1300             Err(ErrMode::Backtrack(_)) => {
1301                 input.reset(start);
1302                 return Ok(res);
1303             }
1304             Err(e) => {
1305                 return Err(e);
1306             }
1307         }
1308     }
1309 }
1310 
fold_repeat1_<I, O, E, F, G, H, R>( f: &mut F, init: &mut H, g: &mut G, input: &mut I, ) -> PResult<R, E> where I: Stream, F: Parser<I, O, E>, G: FnMut(R, O) -> R, H: FnMut() -> R, E: ParserError<I>,1311 fn fold_repeat1_<I, O, E, F, G, H, R>(
1312     f: &mut F,
1313     init: &mut H,
1314     g: &mut G,
1315     input: &mut I,
1316 ) -> PResult<R, E>
1317 where
1318     I: Stream,
1319     F: Parser<I, O, E>,
1320     G: FnMut(R, O) -> R,
1321     H: FnMut() -> R,
1322     E: ParserError<I>,
1323 {
1324     let init = init();
1325     match f.parse_next(input) {
1326         Err(ErrMode::Backtrack(_)) => Err(ErrMode::from_error_kind(input, ErrorKind::Many)),
1327         Err(e) => Err(e),
1328         Ok(o1) => {
1329             let mut acc = g(init, o1);
1330 
1331             loop {
1332                 let start = input.checkpoint();
1333                 let len = input.eof_offset();
1334                 match f.parse_next(input) {
1335                     Err(ErrMode::Backtrack(_)) => {
1336                         input.reset(start);
1337                         break;
1338                     }
1339                     Err(e) => return Err(e),
1340                     Ok(o) => {
1341                         // infinite loop check: the parser must always consume
1342                         if input.eof_offset() == len {
1343                             return Err(ErrMode::assert(
1344                                 input,
1345                                 "`repeat` parsers must always consume",
1346                             ));
1347                         }
1348 
1349                         acc = g(acc, o);
1350                     }
1351                 }
1352             }
1353 
1354             Ok(acc)
1355         }
1356     }
1357 }
1358 
fold_repeat_m_n_<I, O, E, F, G, H, R>( min: usize, max: usize, parse: &mut F, init: &mut H, fold: &mut G, input: &mut I, ) -> PResult<R, E> where I: Stream, F: Parser<I, O, E>, G: FnMut(R, O) -> R, H: FnMut() -> R, E: ParserError<I>,1359 fn fold_repeat_m_n_<I, O, E, F, G, H, R>(
1360     min: usize,
1361     max: usize,
1362     parse: &mut F,
1363     init: &mut H,
1364     fold: &mut G,
1365     input: &mut I,
1366 ) -> PResult<R, E>
1367 where
1368     I: Stream,
1369     F: Parser<I, O, E>,
1370     G: FnMut(R, O) -> R,
1371     H: FnMut() -> R,
1372     E: ParserError<I>,
1373 {
1374     if min > max {
1375         return Err(ErrMode::Cut(E::from_error_kind(input, ErrorKind::Many)));
1376     }
1377 
1378     let mut acc = init();
1379     for count in 0..max {
1380         let start = input.checkpoint();
1381         let len = input.eof_offset();
1382         match parse.parse_next(input) {
1383             Ok(value) => {
1384                 // infinite loop check: the parser must always consume
1385                 if input.eof_offset() == len {
1386                     return Err(ErrMode::assert(
1387                         input,
1388                         "`repeat` parsers must always consume",
1389                     ));
1390                 }
1391 
1392                 acc = fold(acc, value);
1393             }
1394             //FInputXMError: handle failure properly
1395             Err(ErrMode::Backtrack(err)) => {
1396                 if count < min {
1397                     return Err(ErrMode::Backtrack(err.append(input, ErrorKind::Many)));
1398                 } else {
1399                     input.reset(start);
1400                     break;
1401                 }
1402             }
1403             Err(e) => return Err(e),
1404         }
1405     }
1406 
1407     Ok(acc)
1408 }
1409