Function length_count

fn length_count<I, E, F, G>(f: F, g: G) -> impl Parser<I, Output = crate::lib::std::vec::Vec<<G as Parser<I>>::Output>, Error = E>
where
    I: Clone,
    <F as Parser<I>>::Output: ToUsize,
    F: Parser<I, Error = E>,
    G: Parser<I, Error = E>,
    E: ParseError<I>

Gets a number from the first parser, then applies the second parser that many times.

Arguments

# use nom::{Err, error::{Error, ErrorKind}, Needed, IResult, Parser};
use nom::number::complete::u8;
use nom::multi::length_count;
use nom::bytes::complete::tag;
use nom::combinator::map;

fn parser(s: &[u8]) -> IResult<&[u8], Vec<&[u8]>> {
  length_count(map(u8, |i| {
     println!("got number: {}", i);
     i
  }), tag("abc")).parse(s)
}

assert_eq!(parser(&b"\x02abcabcabc"[..]), Ok(((&b"abc"[..], vec![&b"abc"[..], &b"abc"[..]]))));
assert_eq!(parser(b"\x03123123123"), Err(Err::Error(Error::new(&b"123123123"[..], ErrorKind::Tag))));