Coverage Report

Created: 2025-12-31 06:16

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