• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! Combinators applying their child parser multiple times
2 
3 #[cfg(test)]
4 mod tests;
5 
6 use crate::error::ErrorKind;
7 use crate::error::ParseError;
8 use crate::internal::{Err, IResult, Needed, Parser};
9 #[cfg(feature = "alloc")]
10 use crate::lib::std::vec::Vec;
11 use crate::traits::{InputLength, InputTake, ToUsize};
12 use core::num::NonZeroUsize;
13 
14 /// Don't pre-allocate more than 64KiB when calling `Vec::with_capacity`.
15 ///
16 /// Pre-allocating memory is a nice optimization but count fields can't
17 /// always be trusted. We should clamp initial capacities to some reasonable
18 /// amount. This reduces the risk of a bogus count value triggering a panic
19 /// due to an OOM error.
20 ///
21 /// This does not affect correctness. Nom will always read the full number
22 /// of elements regardless of the capacity cap.
23 #[cfg(feature = "alloc")]
24 const MAX_INITIAL_CAPACITY_BYTES: usize = 65536;
25 
26 /// Repeats the embedded parser, gathering the results in a `Vec`.
27 ///
28 /// This stops on [`Err::Error`] and returns the results that were accumulated. To instead chain an error up, see
29 /// [`cut`][crate::combinator::cut].
30 ///
31 /// # Arguments
32 /// * `f` The parser to apply.
33 ///
34 /// *Note*: if the parser passed in accepts empty inputs (like `alpha0` or `digit0`), `many0` will
35 /// return an error, to prevent going into an infinite loop
36 ///
37 /// ```rust
38 /// # use nom::{Err, error::ErrorKind, Needed, IResult};
39 /// use nom::multi::many0;
40 /// use nom::bytes::complete::tag;
41 ///
42 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
43 ///   many0(tag("abc"))(s)
44 /// }
45 ///
46 /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
47 /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
48 /// assert_eq!(parser("123123"), Ok(("123123", vec![])));
49 /// assert_eq!(parser(""), Ok(("", vec![])));
50 /// ```
51 #[cfg(feature = "alloc")]
52 #[cfg_attr(feature = "docsrs", doc(cfg(feature = "alloc")))]
many0<I, O, E, F>(mut f: F) -> impl FnMut(I) -> IResult<I, Vec<O>, E> where I: Clone + InputLength, F: Parser<I, O, E>, E: ParseError<I>,53 pub fn many0<I, O, E, F>(mut f: F) -> impl FnMut(I) -> IResult<I, Vec<O>, E>
54 where
55   I: Clone + InputLength,
56   F: Parser<I, O, E>,
57   E: ParseError<I>,
58 {
59   move |mut i: I| {
60     let mut acc = crate::lib::std::vec::Vec::with_capacity(4);
61     loop {
62       let len = i.input_len();
63       match f.parse(i.clone()) {
64         Err(Err::Error(_)) => return Ok((i, acc)),
65         Err(e) => return Err(e),
66         Ok((i1, o)) => {
67           // infinite loop check: the parser must always consume
68           if i1.input_len() == len {
69             return Err(Err::Error(E::from_error_kind(i, ErrorKind::Many0)));
70           }
71 
72           i = i1;
73           acc.push(o);
74         }
75       }
76     }
77   }
78 }
79 
80 /// Runs the embedded parser, gathering the results in a `Vec`.
81 ///
82 /// This stops on [`Err::Error`] if there is at least one result,  and returns the results that were accumulated. To instead chain an error up,
83 /// see [`cut`][crate::combinator::cut].
84 ///
85 /// # Arguments
86 /// * `f` The parser to apply.
87 ///
88 /// *Note*: If the parser passed to `many1` accepts empty inputs
89 /// (like `alpha0` or `digit0`), `many1` will return an error,
90 /// to prevent going into an infinite loop.
91 ///
92 /// ```rust
93 /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
94 /// use nom::multi::many1;
95 /// use nom::bytes::complete::tag;
96 ///
97 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
98 ///   many1(tag("abc"))(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"), Err(Err::Error(Error::new("123123", ErrorKind::Tag))));
104 /// assert_eq!(parser(""), Err(Err::Error(Error::new("", ErrorKind::Tag))));
105 /// ```
106 #[cfg(feature = "alloc")]
107 #[cfg_attr(feature = "docsrs", doc(cfg(feature = "alloc")))]
many1<I, O, E, F>(mut f: F) -> impl FnMut(I) -> IResult<I, Vec<O>, E> where I: Clone + InputLength, F: Parser<I, O, E>, E: ParseError<I>,108 pub fn many1<I, O, E, F>(mut f: F) -> impl FnMut(I) -> IResult<I, Vec<O>, E>
109 where
110   I: Clone + InputLength,
111   F: Parser<I, O, E>,
112   E: ParseError<I>,
113 {
114   move |mut i: I| match f.parse(i.clone()) {
115     Err(Err::Error(err)) => Err(Err::Error(E::append(i, ErrorKind::Many1, err))),
116     Err(e) => Err(e),
117     Ok((i1, o)) => {
118       let mut acc = crate::lib::std::vec::Vec::with_capacity(4);
119       acc.push(o);
120       i = i1;
121 
122       loop {
123         let len = i.input_len();
124         match f.parse(i.clone()) {
125           Err(Err::Error(_)) => return Ok((i, acc)),
126           Err(e) => return Err(e),
127           Ok((i1, o)) => {
128             // infinite loop check: the parser must always consume
129             if i1.input_len() == len {
130               return Err(Err::Error(E::from_error_kind(i, ErrorKind::Many1)));
131             }
132 
133             i = i1;
134             acc.push(o);
135           }
136         }
137       }
138     }
139   }
140 }
141 
142 /// Applies the parser `f` until the parser `g` produces a result.
143 ///
144 /// Returns a tuple of the results of `f` in a `Vec` and the result of `g`.
145 ///
146 /// `f` keeps going so long as `g` produces [`Err::Error`]. To instead chain an error up, see [`cut`][crate::combinator::cut].
147 ///
148 /// ```rust
149 /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
150 /// use nom::multi::many_till;
151 /// use nom::bytes::complete::tag;
152 ///
153 /// fn parser(s: &str) -> IResult<&str, (Vec<&str>, &str)> {
154 ///   many_till(tag("abc"), tag("end"))(s)
155 /// };
156 ///
157 /// assert_eq!(parser("abcabcend"), Ok(("", (vec!["abc", "abc"], "end"))));
158 /// assert_eq!(parser("abc123end"), Err(Err::Error(Error::new("123end", ErrorKind::Tag))));
159 /// assert_eq!(parser("123123end"), Err(Err::Error(Error::new("123123end", ErrorKind::Tag))));
160 /// assert_eq!(parser(""), Err(Err::Error(Error::new("", ErrorKind::Tag))));
161 /// assert_eq!(parser("abcendefg"), Ok(("efg", (vec!["abc"], "end"))));
162 /// ```
163 #[cfg(feature = "alloc")]
164 #[cfg_attr(feature = "docsrs", doc(cfg(feature = "alloc")))]
many_till<I, O, P, E, F, G>( mut f: F, mut g: G, ) -> impl FnMut(I) -> IResult<I, (Vec<O>, P), E> where I: Clone + InputLength, F: Parser<I, O, E>, G: Parser<I, P, E>, E: ParseError<I>,165 pub fn many_till<I, O, P, E, F, G>(
166   mut f: F,
167   mut g: G,
168 ) -> impl FnMut(I) -> IResult<I, (Vec<O>, P), E>
169 where
170   I: Clone + InputLength,
171   F: Parser<I, O, E>,
172   G: Parser<I, P, E>,
173   E: ParseError<I>,
174 {
175   move |mut i: I| {
176     let mut res = crate::lib::std::vec::Vec::new();
177     loop {
178       let len = i.input_len();
179       match g.parse(i.clone()) {
180         Ok((i1, o)) => return Ok((i1, (res, o))),
181         Err(Err::Error(_)) => {
182           match f.parse(i.clone()) {
183             Err(Err::Error(err)) => return Err(Err::Error(E::append(i, ErrorKind::ManyTill, err))),
184             Err(e) => return Err(e),
185             Ok((i1, o)) => {
186               // infinite loop check: the parser must always consume
187               if i1.input_len() == len {
188                 return Err(Err::Error(E::from_error_kind(i1, ErrorKind::ManyTill)));
189               }
190 
191               res.push(o);
192               i = i1;
193             }
194           }
195         }
196         Err(e) => return Err(e),
197       }
198     }
199   }
200 }
201 
202 /// Alternates between two parsers to produce a list of elements.
203 ///
204 /// This stops when either parser returns [`Err::Error`]  and returns the results that were accumulated. To instead chain an error up, see
205 /// [`cut`][crate::combinator::cut].
206 ///
207 /// # Arguments
208 /// * `sep` Parses the separator between list elements.
209 /// * `f` Parses the elements of the list.
210 ///
211 /// ```rust
212 /// # use nom::{Err, error::ErrorKind, Needed, IResult};
213 /// use nom::multi::separated_list0;
214 /// use nom::bytes::complete::tag;
215 ///
216 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
217 ///   separated_list0(tag("|"), tag("abc"))(s)
218 /// }
219 ///
220 /// assert_eq!(parser("abc|abc|abc"), Ok(("", vec!["abc", "abc", "abc"])));
221 /// assert_eq!(parser("abc123abc"), Ok(("123abc", vec!["abc"])));
222 /// assert_eq!(parser("abc|def"), Ok(("|def", vec!["abc"])));
223 /// assert_eq!(parser(""), Ok(("", vec![])));
224 /// assert_eq!(parser("def|abc"), Ok(("def|abc", vec![])));
225 /// ```
226 #[cfg(feature = "alloc")]
227 #[cfg_attr(feature = "docsrs", doc(cfg(feature = "alloc")))]
separated_list0<I, O, O2, E, F, G>( mut sep: G, mut f: F, ) -> impl FnMut(I) -> IResult<I, Vec<O>, E> where I: Clone + InputLength, F: Parser<I, O, E>, G: Parser<I, O2, E>, E: ParseError<I>,228 pub fn separated_list0<I, O, O2, E, F, G>(
229   mut sep: G,
230   mut f: F,
231 ) -> impl FnMut(I) -> IResult<I, Vec<O>, E>
232 where
233   I: Clone + InputLength,
234   F: Parser<I, O, E>,
235   G: Parser<I, O2, E>,
236   E: ParseError<I>,
237 {
238   move |mut i: I| {
239     let mut res = Vec::new();
240 
241     match f.parse(i.clone()) {
242       Err(Err::Error(_)) => return Ok((i, res)),
243       Err(e) => return Err(e),
244       Ok((i1, o)) => {
245         res.push(o);
246         i = i1;
247       }
248     }
249 
250     loop {
251       let len = i.input_len();
252       match sep.parse(i.clone()) {
253         Err(Err::Error(_)) => return Ok((i, res)),
254         Err(e) => return Err(e),
255         Ok((i1, _)) => {
256           // infinite loop check: the parser must always consume
257           if i1.input_len() == len {
258             return Err(Err::Error(E::from_error_kind(i1, ErrorKind::SeparatedList)));
259           }
260 
261           match f.parse(i1.clone()) {
262             Err(Err::Error(_)) => return Ok((i, res)),
263             Err(e) => return Err(e),
264             Ok((i2, o)) => {
265               res.push(o);
266               i = i2;
267             }
268           }
269         }
270       }
271     }
272   }
273 }
274 
275 /// Alternates between two parsers to produce a list of elements until [`Err::Error`].
276 ///
277 /// Fails if the element parser does not produce at least one element.$
278 ///
279 /// This stops when either parser returns [`Err::Error`]  and returns the results that were accumulated. To instead chain an error up, see
280 /// [`cut`][crate::combinator::cut].
281 ///
282 /// # Arguments
283 /// * `sep` Parses the separator between list elements.
284 /// * `f` Parses the elements of the list.
285 /// ```rust
286 /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
287 /// use nom::multi::separated_list1;
288 /// use nom::bytes::complete::tag;
289 ///
290 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
291 ///   separated_list1(tag("|"), tag("abc"))(s)
292 /// }
293 ///
294 /// assert_eq!(parser("abc|abc|abc"), Ok(("", vec!["abc", "abc", "abc"])));
295 /// assert_eq!(parser("abc123abc"), Ok(("123abc", vec!["abc"])));
296 /// assert_eq!(parser("abc|def"), Ok(("|def", vec!["abc"])));
297 /// assert_eq!(parser(""), Err(Err::Error(Error::new("", ErrorKind::Tag))));
298 /// assert_eq!(parser("def|abc"), Err(Err::Error(Error::new("def|abc", ErrorKind::Tag))));
299 /// ```
300 #[cfg(feature = "alloc")]
301 #[cfg_attr(feature = "docsrs", doc(cfg(feature = "alloc")))]
separated_list1<I, O, O2, E, F, G>( mut sep: G, mut f: F, ) -> impl FnMut(I) -> IResult<I, Vec<O>, E> where I: Clone + InputLength, F: Parser<I, O, E>, G: Parser<I, O2, E>, E: ParseError<I>,302 pub fn separated_list1<I, O, O2, E, F, G>(
303   mut sep: G,
304   mut f: F,
305 ) -> impl FnMut(I) -> IResult<I, Vec<O>, E>
306 where
307   I: Clone + InputLength,
308   F: Parser<I, O, E>,
309   G: Parser<I, O2, E>,
310   E: ParseError<I>,
311 {
312   move |mut i: I| {
313     let mut res = Vec::new();
314 
315     // Parse the first element
316     match f.parse(i.clone()) {
317       Err(e) => return Err(e),
318       Ok((i1, o)) => {
319         res.push(o);
320         i = i1;
321       }
322     }
323 
324     loop {
325       let len = i.input_len();
326       match sep.parse(i.clone()) {
327         Err(Err::Error(_)) => return Ok((i, res)),
328         Err(e) => return Err(e),
329         Ok((i1, _)) => {
330           // infinite loop check: the parser must always consume
331           if i1.input_len() == len {
332             return Err(Err::Error(E::from_error_kind(i1, ErrorKind::SeparatedList)));
333           }
334 
335           match f.parse(i1.clone()) {
336             Err(Err::Error(_)) => return Ok((i, res)),
337             Err(e) => return Err(e),
338             Ok((i2, o)) => {
339               res.push(o);
340               i = i2;
341             }
342           }
343         }
344       }
345     }
346   }
347 }
348 
349 /// Repeats the embedded parser `m..=n` times
350 ///
351 /// This stops before `n` when the parser returns [`Err::Error`]  and returns the results that were accumulated. To instead chain an error up, see
352 /// [`cut`][crate::combinator::cut].
353 ///
354 /// # Arguments
355 /// * `m` The minimum number of iterations.
356 /// * `n` The maximum number of iterations.
357 /// * `f` The parser to apply.
358 ///
359 /// *Note*: If the parser passed to `many1` accepts empty inputs
360 /// (like `alpha0` or `digit0`), `many1` will return an error,
361 /// to prevent going into an infinite loop.
362 ///
363 /// ```rust
364 /// # use nom::{Err, error::ErrorKind, Needed, IResult};
365 /// use nom::multi::many_m_n;
366 /// use nom::bytes::complete::tag;
367 ///
368 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
369 ///   many_m_n(0, 2, tag("abc"))(s)
370 /// }
371 ///
372 /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
373 /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
374 /// assert_eq!(parser("123123"), Ok(("123123", vec![])));
375 /// assert_eq!(parser(""), Ok(("", vec![])));
376 /// assert_eq!(parser("abcabcabc"), Ok(("abc", vec!["abc", "abc"])));
377 /// ```
378 #[cfg(feature = "alloc")]
379 #[cfg_attr(feature = "docsrs", doc(cfg(feature = "alloc")))]
many_m_n<I, O, E, F>( min: usize, max: usize, mut parse: F, ) -> impl FnMut(I) -> IResult<I, Vec<O>, E> where I: Clone + InputLength, F: Parser<I, O, E>, E: ParseError<I>,380 pub fn many_m_n<I, O, E, F>(
381   min: usize,
382   max: usize,
383   mut parse: F,
384 ) -> impl FnMut(I) -> IResult<I, Vec<O>, E>
385 where
386   I: Clone + InputLength,
387   F: Parser<I, O, E>,
388   E: ParseError<I>,
389 {
390   move |mut input: I| {
391     if min > max {
392       return Err(Err::Failure(E::from_error_kind(input, ErrorKind::ManyMN)));
393     }
394 
395     let max_initial_capacity =
396       MAX_INITIAL_CAPACITY_BYTES / crate::lib::std::mem::size_of::<O>().max(1);
397     let mut res = crate::lib::std::vec::Vec::with_capacity(min.min(max_initial_capacity));
398     for count in 0..max {
399       let len = input.input_len();
400       match parse.parse(input.clone()) {
401         Ok((tail, value)) => {
402           // infinite loop check: the parser must always consume
403           if tail.input_len() == len {
404             return Err(Err::Error(E::from_error_kind(input, ErrorKind::ManyMN)));
405           }
406 
407           res.push(value);
408           input = tail;
409         }
410         Err(Err::Error(e)) => {
411           if count < min {
412             return Err(Err::Error(E::append(input, ErrorKind::ManyMN, e)));
413           } else {
414             return Ok((input, res));
415           }
416         }
417         Err(e) => {
418           return Err(e);
419         }
420       }
421     }
422 
423     Ok((input, res))
424   }
425 }
426 
427 /// Repeats the embedded parser, counting the results
428 ///
429 /// This stops on [`Err::Error`]. To instead chain an error up, see
430 /// [`cut`][crate::combinator::cut].
431 ///
432 /// # Arguments
433 /// * `f` The parser to apply.
434 ///
435 /// *Note*: if the parser passed in accepts empty inputs (like `alpha0` or `digit0`), `many0` will
436 /// return an error, to prevent going into an infinite loop
437 ///
438 /// ```rust
439 /// # use nom::{Err, error::ErrorKind, Needed, IResult};
440 /// use nom::multi::many0_count;
441 /// use nom::bytes::complete::tag;
442 ///
443 /// fn parser(s: &str) -> IResult<&str, usize> {
444 ///   many0_count(tag("abc"))(s)
445 /// }
446 ///
447 /// assert_eq!(parser("abcabc"), Ok(("", 2)));
448 /// assert_eq!(parser("abc123"), Ok(("123", 1)));
449 /// assert_eq!(parser("123123"), Ok(("123123", 0)));
450 /// assert_eq!(parser(""), Ok(("", 0)));
451 /// ```
many0_count<I, O, E, F>(mut f: F) -> impl FnMut(I) -> IResult<I, usize, E> where I: Clone + InputLength, F: Parser<I, O, E>, E: ParseError<I>,452 pub fn many0_count<I, O, E, F>(mut f: F) -> impl FnMut(I) -> IResult<I, usize, E>
453 where
454   I: Clone + InputLength,
455   F: Parser<I, O, E>,
456   E: ParseError<I>,
457 {
458   move |i: I| {
459     let mut input = i;
460     let mut count = 0;
461 
462     loop {
463       let input_ = input.clone();
464       let len = input.input_len();
465       match f.parse(input_) {
466         Ok((i, _)) => {
467           // infinite loop check: the parser must always consume
468           if i.input_len() == len {
469             return Err(Err::Error(E::from_error_kind(input, ErrorKind::Many0Count)));
470           }
471 
472           input = i;
473           count += 1;
474         }
475 
476         Err(Err::Error(_)) => return Ok((input, count)),
477 
478         Err(e) => return Err(e),
479       }
480     }
481   }
482 }
483 
484 /// Runs the embedded parser, counting the results.
485 ///
486 /// This stops on [`Err::Error`] if there is at least one result. To instead chain an error up,
487 /// see [`cut`][crate::combinator::cut].
488 ///
489 /// # Arguments
490 /// * `f` The parser to apply.
491 ///
492 /// *Note*: If the parser passed to `many1` accepts empty inputs
493 /// (like `alpha0` or `digit0`), `many1` will return an error,
494 /// to prevent going into an infinite loop.
495 ///
496 /// ```rust
497 /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
498 /// use nom::multi::many1_count;
499 /// use nom::bytes::complete::tag;
500 ///
501 /// fn parser(s: &str) -> IResult<&str, usize> {
502 ///   many1_count(tag("abc"))(s)
503 /// }
504 ///
505 /// assert_eq!(parser("abcabc"), Ok(("", 2)));
506 /// assert_eq!(parser("abc123"), Ok(("123", 1)));
507 /// assert_eq!(parser("123123"), Err(Err::Error(Error::new("123123", ErrorKind::Many1Count))));
508 /// assert_eq!(parser(""), Err(Err::Error(Error::new("", ErrorKind::Many1Count))));
509 /// ```
many1_count<I, O, E, F>(mut f: F) -> impl FnMut(I) -> IResult<I, usize, E> where I: Clone + InputLength, F: Parser<I, O, E>, E: ParseError<I>,510 pub fn many1_count<I, O, E, F>(mut f: F) -> impl FnMut(I) -> IResult<I, usize, E>
511 where
512   I: Clone + InputLength,
513   F: Parser<I, O, E>,
514   E: ParseError<I>,
515 {
516   move |i: I| {
517     let i_ = i.clone();
518     match f.parse(i_) {
519       Err(Err::Error(_)) => Err(Err::Error(E::from_error_kind(i, ErrorKind::Many1Count))),
520       Err(i) => Err(i),
521       Ok((i1, _)) => {
522         let mut count = 1;
523         let mut input = i1;
524 
525         loop {
526           let len = input.input_len();
527           let input_ = input.clone();
528           match f.parse(input_) {
529             Err(Err::Error(_)) => return Ok((input, count)),
530             Err(e) => return Err(e),
531             Ok((i, _)) => {
532               // infinite loop check: the parser must always consume
533               if i.input_len() == len {
534                 return Err(Err::Error(E::from_error_kind(i, ErrorKind::Many1Count)));
535               }
536 
537               count += 1;
538               input = i;
539             }
540           }
541         }
542       }
543     }
544   }
545 }
546 
547 /// Runs the embedded parser `count` times, gathering the results in a `Vec`
548 ///
549 /// # Arguments
550 /// * `f` The parser to apply.
551 /// * `count` How often to apply the parser.
552 /// ```rust
553 /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
554 /// use nom::multi::count;
555 /// use nom::bytes::complete::tag;
556 ///
557 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
558 ///   count(tag("abc"), 2)(s)
559 /// }
560 ///
561 /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
562 /// assert_eq!(parser("abc123"), Err(Err::Error(Error::new("123", ErrorKind::Tag))));
563 /// assert_eq!(parser("123123"), Err(Err::Error(Error::new("123123", ErrorKind::Tag))));
564 /// assert_eq!(parser(""), Err(Err::Error(Error::new("", ErrorKind::Tag))));
565 /// assert_eq!(parser("abcabcabc"), Ok(("abc", vec!["abc", "abc"])));
566 /// ```
567 #[cfg(feature = "alloc")]
568 #[cfg_attr(feature = "docsrs", doc(cfg(feature = "alloc")))]
count<I, O, E, F>(mut f: F, count: usize) -> impl FnMut(I) -> IResult<I, Vec<O>, E> where I: Clone + PartialEq, F: Parser<I, O, E>, E: ParseError<I>,569 pub fn count<I, O, E, F>(mut f: F, count: usize) -> impl FnMut(I) -> IResult<I, Vec<O>, E>
570 where
571   I: Clone + PartialEq,
572   F: Parser<I, O, E>,
573   E: ParseError<I>,
574 {
575   move |i: I| {
576     let mut input = i.clone();
577     let max_initial_capacity =
578       MAX_INITIAL_CAPACITY_BYTES / crate::lib::std::mem::size_of::<O>().max(1);
579     let mut res = crate::lib::std::vec::Vec::with_capacity(count.min(max_initial_capacity));
580 
581     for _ in 0..count {
582       let input_ = input.clone();
583       match f.parse(input_) {
584         Ok((i, o)) => {
585           res.push(o);
586           input = i;
587         }
588         Err(Err::Error(e)) => {
589           return Err(Err::Error(E::append(i, ErrorKind::Count, e)));
590         }
591         Err(e) => {
592           return Err(e);
593         }
594       }
595     }
596 
597     Ok((input, res))
598   }
599 }
600 
601 /// Runs the embedded parser repeatedly, filling the given slice with results.
602 ///
603 /// This parser fails if the input runs out before the given slice is full.
604 ///
605 /// # Arguments
606 /// * `f` The parser to apply.
607 /// * `buf` The slice to fill
608 /// ```rust
609 /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
610 /// use nom::multi::fill;
611 /// use nom::bytes::complete::tag;
612 ///
613 /// fn parser(s: &str) -> IResult<&str, [&str; 2]> {
614 ///   let mut buf = ["", ""];
615 ///   let (rest, ()) = fill(tag("abc"), &mut buf)(s)?;
616 ///   Ok((rest, buf))
617 /// }
618 ///
619 /// assert_eq!(parser("abcabc"), Ok(("", ["abc", "abc"])));
620 /// assert_eq!(parser("abc123"), Err(Err::Error(Error::new("123", ErrorKind::Tag))));
621 /// assert_eq!(parser("123123"), Err(Err::Error(Error::new("123123", ErrorKind::Tag))));
622 /// assert_eq!(parser(""), Err(Err::Error(Error::new("", ErrorKind::Tag))));
623 /// assert_eq!(parser("abcabcabc"), Ok(("abc", ["abc", "abc"])));
624 /// ```
fill<'a, I, O, E, F>(f: F, buf: &'a mut [O]) -> impl FnMut(I) -> IResult<I, (), E> + 'a where I: Clone + PartialEq, F: Fn(I) -> IResult<I, O, E> + 'a, E: ParseError<I>,625 pub fn fill<'a, I, O, E, F>(f: F, buf: &'a mut [O]) -> impl FnMut(I) -> IResult<I, (), E> + 'a
626 where
627   I: Clone + PartialEq,
628   F: Fn(I) -> IResult<I, O, E> + 'a,
629   E: ParseError<I>,
630 {
631   move |i: I| {
632     let mut input = i.clone();
633 
634     for elem in buf.iter_mut() {
635       let input_ = input.clone();
636       match f(input_) {
637         Ok((i, o)) => {
638           *elem = o;
639           input = i;
640         }
641         Err(Err::Error(e)) => {
642           return Err(Err::Error(E::append(i, ErrorKind::Count, e)));
643         }
644         Err(e) => {
645           return Err(e);
646         }
647       }
648     }
649 
650     Ok((input, ()))
651   }
652 }
653 
654 /// Repeats the embedded parser, calling `g` to gather the results.
655 ///
656 /// This stops on [`Err::Error`]. To instead chain an error up, see
657 /// [`cut`][crate::combinator::cut].
658 ///
659 /// # Arguments
660 /// * `f` The parser to apply.
661 /// * `init` A function returning the initial value.
662 /// * `g` The function that combines a result of `f` with
663 ///       the current accumulator.
664 ///
665 /// *Note*: if the parser passed in accepts empty inputs (like `alpha0` or `digit0`), `many0` will
666 /// return an error, to prevent going into an infinite loop
667 ///
668 /// ```rust
669 /// # use nom::{Err, error::ErrorKind, Needed, IResult};
670 /// use nom::multi::fold_many0;
671 /// use nom::bytes::complete::tag;
672 ///
673 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
674 ///   fold_many0(
675 ///     tag("abc"),
676 ///     Vec::new,
677 ///     |mut acc: Vec<_>, item| {
678 ///       acc.push(item);
679 ///       acc
680 ///     }
681 ///   )(s)
682 /// }
683 ///
684 /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
685 /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
686 /// assert_eq!(parser("123123"), Ok(("123123", vec![])));
687 /// assert_eq!(parser(""), Ok(("", vec![])));
688 /// ```
fold_many0<I, O, E, F, G, H, R>( mut f: F, mut init: H, mut g: G, ) -> impl FnMut(I) -> IResult<I, R, E> where I: Clone + InputLength, F: Parser<I, O, E>, G: FnMut(R, O) -> R, H: FnMut() -> R, E: ParseError<I>,689 pub fn fold_many0<I, O, E, F, G, H, R>(
690   mut f: F,
691   mut init: H,
692   mut g: G,
693 ) -> impl FnMut(I) -> IResult<I, R, E>
694 where
695   I: Clone + InputLength,
696   F: Parser<I, O, E>,
697   G: FnMut(R, O) -> R,
698   H: FnMut() -> R,
699   E: ParseError<I>,
700 {
701   move |i: I| {
702     let mut res = init();
703     let mut input = i;
704 
705     loop {
706       let i_ = input.clone();
707       let len = input.input_len();
708       match f.parse(i_) {
709         Ok((i, o)) => {
710           // infinite loop check: the parser must always consume
711           if i.input_len() == len {
712             return Err(Err::Error(E::from_error_kind(input, ErrorKind::Many0)));
713           }
714 
715           res = g(res, o);
716           input = i;
717         }
718         Err(Err::Error(_)) => {
719           return Ok((input, res));
720         }
721         Err(e) => {
722           return Err(e);
723         }
724       }
725     }
726   }
727 }
728 
729 /// Repeats the embedded parser, calling `g` to gather the results.
730 ///
731 /// This stops on [`Err::Error`] if there is at least one result. To instead chain an error up,
732 /// see [`cut`][crate::combinator::cut].
733 ///
734 /// # Arguments
735 /// * `f` The parser to apply.
736 /// * `init` A function returning the initial value.
737 /// * `g` The function that combines a result of `f` with
738 ///       the current accumulator.
739 ///
740 /// *Note*: If the parser passed to `many1` accepts empty inputs
741 /// (like `alpha0` or `digit0`), `many1` will return an error,
742 /// to prevent going into an infinite loop.
743 ///
744 /// ```rust
745 /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
746 /// use nom::multi::fold_many1;
747 /// use nom::bytes::complete::tag;
748 ///
749 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
750 ///   fold_many1(
751 ///     tag("abc"),
752 ///     Vec::new,
753 ///     |mut acc: Vec<_>, item| {
754 ///       acc.push(item);
755 ///       acc
756 ///     }
757 ///   )(s)
758 /// }
759 ///
760 /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
761 /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
762 /// assert_eq!(parser("123123"), Err(Err::Error(Error::new("123123", ErrorKind::Many1))));
763 /// assert_eq!(parser(""), Err(Err::Error(Error::new("", ErrorKind::Many1))));
764 /// ```
fold_many1<I, O, E, F, G, H, R>( mut f: F, mut init: H, mut g: G, ) -> impl FnMut(I) -> IResult<I, R, E> where I: Clone + InputLength, F: Parser<I, O, E>, G: FnMut(R, O) -> R, H: FnMut() -> R, E: ParseError<I>,765 pub fn fold_many1<I, O, E, F, G, H, R>(
766   mut f: F,
767   mut init: H,
768   mut g: G,
769 ) -> impl FnMut(I) -> IResult<I, R, E>
770 where
771   I: Clone + InputLength,
772   F: Parser<I, O, E>,
773   G: FnMut(R, O) -> R,
774   H: FnMut() -> R,
775   E: ParseError<I>,
776 {
777   move |i: I| {
778     let _i = i.clone();
779     let init = init();
780     match f.parse(_i) {
781       Err(Err::Error(_)) => Err(Err::Error(E::from_error_kind(i, ErrorKind::Many1))),
782       Err(e) => Err(e),
783       Ok((i1, o1)) => {
784         let mut acc = g(init, o1);
785         let mut input = i1;
786 
787         loop {
788           let _input = input.clone();
789           let len = input.input_len();
790           match f.parse(_input) {
791             Err(Err::Error(_)) => {
792               break;
793             }
794             Err(e) => return Err(e),
795             Ok((i, o)) => {
796               // infinite loop check: the parser must always consume
797               if i.input_len() == len {
798                 return Err(Err::Failure(E::from_error_kind(i, ErrorKind::Many1)));
799               }
800 
801               acc = g(acc, o);
802               input = i;
803             }
804           }
805         }
806 
807         Ok((input, acc))
808       }
809     }
810   }
811 }
812 
813 /// Repeats the embedded parser `m..=n` times, calling `g` to gather the results
814 ///
815 /// This stops before `n` when the parser returns [`Err::Error`]. To instead chain an error up, see
816 /// [`cut`][crate::combinator::cut].
817 ///
818 /// # Arguments
819 /// * `m` The minimum number of iterations.
820 /// * `n` The maximum number of iterations.
821 /// * `f` The parser to apply.
822 /// * `init` A function returning the initial value.
823 /// * `g` The function that combines a result of `f` with
824 ///       the current accumulator.
825 ///
826 /// *Note*: If the parser passed to `many1` accepts empty inputs
827 /// (like `alpha0` or `digit0`), `many1` will return an error,
828 /// to prevent going into an infinite loop.
829 ///
830 /// ```rust
831 /// # use nom::{Err, error::ErrorKind, Needed, IResult};
832 /// use nom::multi::fold_many_m_n;
833 /// use nom::bytes::complete::tag;
834 ///
835 /// fn parser(s: &str) -> IResult<&str, Vec<&str>> {
836 ///   fold_many_m_n(
837 ///     0,
838 ///     2,
839 ///     tag("abc"),
840 ///     Vec::new,
841 ///     |mut acc: Vec<_>, item| {
842 ///       acc.push(item);
843 ///       acc
844 ///     }
845 ///   )(s)
846 /// }
847 ///
848 /// assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
849 /// assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
850 /// assert_eq!(parser("123123"), Ok(("123123", vec![])));
851 /// assert_eq!(parser(""), Ok(("", vec![])));
852 /// assert_eq!(parser("abcabcabc"), Ok(("abc", vec!["abc", "abc"])));
853 /// ```
fold_many_m_n<I, O, E, F, G, H, R>( min: usize, max: usize, mut parse: F, mut init: H, mut fold: G, ) -> impl FnMut(I) -> IResult<I, R, E> where I: Clone + InputLength, F: Parser<I, O, E>, G: FnMut(R, O) -> R, H: FnMut() -> R, E: ParseError<I>,854 pub fn fold_many_m_n<I, O, E, F, G, H, R>(
855   min: usize,
856   max: usize,
857   mut parse: F,
858   mut init: H,
859   mut fold: G,
860 ) -> impl FnMut(I) -> IResult<I, R, E>
861 where
862   I: Clone + InputLength,
863   F: Parser<I, O, E>,
864   G: FnMut(R, O) -> R,
865   H: FnMut() -> R,
866   E: ParseError<I>,
867 {
868   move |mut input: I| {
869     if min > max {
870       return Err(Err::Failure(E::from_error_kind(input, ErrorKind::ManyMN)));
871     }
872 
873     let mut acc = init();
874     for count in 0..max {
875       let len = input.input_len();
876       match parse.parse(input.clone()) {
877         Ok((tail, value)) => {
878           // infinite loop check: the parser must always consume
879           if tail.input_len() == len {
880             return Err(Err::Error(E::from_error_kind(tail, ErrorKind::ManyMN)));
881           }
882 
883           acc = fold(acc, value);
884           input = tail;
885         }
886         //FInputXMError: handle failure properly
887         Err(Err::Error(err)) => {
888           if count < min {
889             return Err(Err::Error(E::append(input, ErrorKind::ManyMN, err)));
890           } else {
891             break;
892           }
893         }
894         Err(e) => return Err(e),
895       }
896     }
897 
898     Ok((input, acc))
899   }
900 }
901 
902 /// Gets a number from the parser and returns a
903 /// subslice of the input of that size.
904 /// If the parser returns `Incomplete`,
905 /// `length_data` will return an error.
906 /// # Arguments
907 /// * `f` The parser to apply.
908 /// ```rust
909 /// # use nom::{Err, error::ErrorKind, Needed, IResult};
910 /// use nom::number::complete::be_u16;
911 /// use nom::multi::length_data;
912 /// use nom::bytes::complete::tag;
913 ///
914 /// fn parser(s: &[u8]) -> IResult<&[u8], &[u8]> {
915 ///   length_data(be_u16)(s)
916 /// }
917 ///
918 /// assert_eq!(parser(b"\x00\x03abcefg"), Ok((&b"efg"[..], &b"abc"[..])));
919 /// assert_eq!(parser(b"\x00\x03a"), Err(Err::Incomplete(Needed::new(2))));
920 /// ```
length_data<I, N, E, F>(mut f: F) -> impl FnMut(I) -> IResult<I, I, E> where I: InputLength + InputTake, N: ToUsize, F: Parser<I, N, E>, E: ParseError<I>,921 pub fn length_data<I, N, E, F>(mut f: F) -> impl FnMut(I) -> IResult<I, I, E>
922 where
923   I: InputLength + InputTake,
924   N: ToUsize,
925   F: Parser<I, N, E>,
926   E: ParseError<I>,
927 {
928   move |i: I| {
929     let (i, length) = f.parse(i)?;
930 
931     let length: usize = length.to_usize();
932 
933     if let Some(needed) = length
934       .checked_sub(i.input_len())
935       .and_then(NonZeroUsize::new)
936     {
937       Err(Err::Incomplete(Needed::Size(needed)))
938     } else {
939       Ok(i.take_split(length))
940     }
941   }
942 }
943 
944 /// Gets a number from the first parser,
945 /// takes a subslice of the input of that size,
946 /// then applies the second parser on that subslice.
947 /// If the second parser returns `Incomplete`,
948 /// `length_value` will return an error.
949 /// # Arguments
950 /// * `f` The parser to apply.
951 /// * `g` The parser to apply on the subslice.
952 /// ```rust
953 /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
954 /// use nom::number::complete::be_u16;
955 /// use nom::multi::length_value;
956 /// use nom::bytes::complete::tag;
957 ///
958 /// fn parser(s: &[u8]) -> IResult<&[u8], &[u8]> {
959 ///   length_value(be_u16, tag("abc"))(s)
960 /// }
961 ///
962 /// assert_eq!(parser(b"\x00\x03abcefg"), Ok((&b"efg"[..], &b"abc"[..])));
963 /// assert_eq!(parser(b"\x00\x03123123"), Err(Err::Error(Error::new(&b"123"[..], ErrorKind::Tag))));
964 /// assert_eq!(parser(b"\x00\x03a"), Err(Err::Incomplete(Needed::new(2))));
965 /// ```
length_value<I, O, N, E, F, G>(mut f: F, mut g: G) -> impl FnMut(I) -> IResult<I, O, E> where I: Clone + InputLength + InputTake, N: ToUsize, F: Parser<I, N, E>, G: Parser<I, O, E>, E: ParseError<I>,966 pub fn length_value<I, O, N, E, F, G>(mut f: F, mut g: G) -> impl FnMut(I) -> IResult<I, O, E>
967 where
968   I: Clone + InputLength + InputTake,
969   N: ToUsize,
970   F: Parser<I, N, E>,
971   G: Parser<I, O, E>,
972   E: ParseError<I>,
973 {
974   move |i: I| {
975     let (i, length) = f.parse(i)?;
976 
977     let length: usize = length.to_usize();
978 
979     if let Some(needed) = length
980       .checked_sub(i.input_len())
981       .and_then(NonZeroUsize::new)
982     {
983       Err(Err::Incomplete(Needed::Size(needed)))
984     } else {
985       let (rest, i) = i.take_split(length);
986       match g.parse(i.clone()) {
987         Err(Err::Incomplete(_)) => Err(Err::Error(E::from_error_kind(i, ErrorKind::Complete))),
988         Err(e) => Err(e),
989         Ok((_, o)) => Ok((rest, o)),
990       }
991     }
992   }
993 }
994 
995 /// Gets a number from the first parser,
996 /// then applies the second parser that many times.
997 /// # Arguments
998 /// * `f` The parser to apply to obtain the count.
999 /// * `g` The parser to apply repeatedly.
1000 /// ```rust
1001 /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
1002 /// use nom::number::complete::u8;
1003 /// use nom::multi::length_count;
1004 /// use nom::bytes::complete::tag;
1005 /// use nom::combinator::map;
1006 ///
1007 /// fn parser(s: &[u8]) -> IResult<&[u8], Vec<&[u8]>> {
1008 ///   length_count(map(u8, |i| {
1009 ///      println!("got number: {}", i);
1010 ///      i
1011 ///   }), tag("abc"))(s)
1012 /// }
1013 ///
1014 /// assert_eq!(parser(&b"\x02abcabcabc"[..]), Ok(((&b"abc"[..], vec![&b"abc"[..], &b"abc"[..]]))));
1015 /// assert_eq!(parser(b"\x03123123123"), Err(Err::Error(Error::new(&b"123123123"[..], ErrorKind::Tag))));
1016 /// ```
1017 #[cfg(feature = "alloc")]
length_count<I, O, N, E, F, G>(mut f: F, mut g: G) -> impl FnMut(I) -> IResult<I, Vec<O>, E> where I: Clone, N: ToUsize, F: Parser<I, N, E>, G: Parser<I, O, E>, E: ParseError<I>,1018 pub fn length_count<I, O, N, E, F, G>(mut f: F, mut g: G) -> impl FnMut(I) -> IResult<I, Vec<O>, E>
1019 where
1020   I: Clone,
1021   N: ToUsize,
1022   F: Parser<I, N, E>,
1023   G: Parser<I, O, E>,
1024   E: ParseError<I>,
1025 {
1026   move |i: I| {
1027     let (i, count) = f.parse(i)?;
1028     let mut input = i.clone();
1029     let mut res = Vec::new();
1030 
1031     for _ in 0..count.to_usize() {
1032       let input_ = input.clone();
1033       match g.parse(input_) {
1034         Ok((i, o)) => {
1035           res.push(o);
1036           input = i;
1037         }
1038         Err(Err::Error(e)) => {
1039           return Err(Err::Error(E::append(i, ErrorKind::Count, e)));
1040         }
1041         Err(e) => {
1042           return Err(e);
1043         }
1044       }
1045     }
1046 
1047     Ok((input, res))
1048   }
1049 }
1050