Struct winnow::combinator::Repeat

source ·
pub struct Repeat<P, I, O, C, E>
where P: Parser<I, O, E>, I: Stream, C: Accumulate<O>, E: ParserError<I>,
{ /* private fields */ }
Expand description

Implementation of repeat

Implementations§

source§

impl<ParseNext, Input, Output, Error> Repeat<ParseNext, Input, Output, (), Error>
where ParseNext: Parser<Input, Output, Error>, Input: Stream, Error: ParserError<Input>,

source

pub fn fold<Init, Op, Result>( self, init: Init, op: Op ) -> impl Parser<Input, Result, Error>
where Init: FnMut() -> Result, Op: FnMut(Result, Output) -> Result,

Repeats the embedded parser, calling g to gather the results

This stops before n when the parser returns ErrMode::Backtrack. To instead chain an error up, see cut_err.

§Arguments
  • init A function returning the initial value.
  • g The function that combines a result of f with the current accumulator.

Warning: If the parser passed to fold accepts empty inputs (like alpha0 or digit0), fold_repeat will return an error, to prevent going into an infinite loop.

§Example

Zero or more repetitions:

use winnow::combinator::repeat;

fn parser(s: &str) -> IResult<&str, Vec<&str>> {
  repeat(
    0..,
    "abc"
  ).fold(
    Vec::new,
    |mut acc: Vec<_>, item| {
      acc.push(item);
      acc
    }
  ).parse_peek(s)
}

assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
assert_eq!(parser("123123"), Ok(("123123", vec![])));
assert_eq!(parser(""), Ok(("", vec![])));

One or more repetitions:

use winnow::combinator::repeat;

fn parser(s: &str) -> IResult<&str, Vec<&str>> {
  repeat(
    1..,
    "abc",
  ).fold(
    Vec::new,
    |mut acc: Vec<_>, item| {
      acc.push(item);
      acc
    }
  ).parse_peek(s)
}

assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
assert_eq!(parser("123123"), Err(ErrMode::Backtrack(InputError::new("123123", ErrorKind::Many))));
assert_eq!(parser(""), Err(ErrMode::Backtrack(InputError::new("", ErrorKind::Many))));

Arbitrary number of repetitions:

use winnow::combinator::repeat;

fn parser(s: &str) -> IResult<&str, Vec<&str>> {
  repeat(
    0..=2,
    "abc",
  ).fold(
    Vec::new,
    |mut acc: Vec<_>, item| {
      acc.push(item);
      acc
    }
  ).parse_peek(s)
}

assert_eq!(parser("abcabc"), Ok(("", vec!["abc", "abc"])));
assert_eq!(parser("abc123"), Ok(("123", vec!["abc"])));
assert_eq!(parser("123123"), Ok(("123123", vec![])));
assert_eq!(parser(""), Ok(("", vec![])));
assert_eq!(parser("abcabcabc"), Ok(("abc", vec!["abc", "abc"])));

Trait Implementations§

source§

impl<P, I, O, C, E> Parser<I, C, E> for Repeat<P, I, O, C, E>
where P: Parser<I, O, E>, I: Stream, C: Accumulate<O>, E: ParserError<I>,

source§

fn parse_next(&mut self, i: &mut I) -> PResult<C, E>

Take tokens from the Stream, turning it into the output Read more
source§

fn parse_peek(&mut self, input: I) -> IResult<I, O, E>

Take tokens from the Stream, turning it into the output Read more
source§

fn by_ref(&mut self) -> ByRef<'_, Self>
where Self: Sized,

Treat &mut Self as a parser Read more
source§

fn value<O2>(self, val: O2) -> Value<Self, I, O, O2, E>
where Self: Sized, O2: Clone,

Produce the provided value Read more
source§

fn default_value<O2>(self) -> DefaultValue<Self, I, O, O2, E>
where Self: Sized, O2: Default,

Produce a type’s default value Read more
source§

fn void(self) -> Void<Self, I, O, E>
where Self: Sized,

Discards the output of the Parser Read more
source§

fn output_into<O2>(self) -> OutputInto<Self, I, O, O2, E>
where Self: Sized, O: Into<O2>,

Convert the parser’s output to another type using std::convert::From Read more
source§

fn recognize(self) -> Recognize<Self, I, O, E>
where Self: Sized, I: Stream,

Produce the consumed input as produced value. Read more
source§

fn with_recognized(self) -> WithRecognized<Self, I, O, E>
where Self: Sized, I: Stream,

Produce the consumed input with the output Read more
source§

fn map<G, O2>(self, map: G) -> Map<Self, G, I, O, O2, E>
where G: FnMut(O) -> O2, Self: Sized,

Maps a function over the output of a parser Read more
source§

fn try_map<G, O2, E2>(self, map: G) -> TryMap<Self, G, I, O, O2, E, E2>
where Self: Sized, G: FnMut(O) -> Result<O2, E2>, I: Stream, E: FromExternalError<I, E2>,

Applies a function returning a Result over the output of a parser. Read more
source§

fn verify_map<G, O2>(self, map: G) -> VerifyMap<Self, G, I, O, O2, E>
where Self: Sized, G: FnMut(O) -> Option<O2>, I: Stream, E: ParserError<I>,

source§

fn flat_map<G, H, O2>(self, map: G) -> FlatMap<Self, G, H, I, O, O2, E>
where Self: Sized, G: FnMut(O) -> H, H: Parser<I, O2, E>,

Creates a parser from the output of this one Read more
source§

fn parse_to<O2>(self) -> ParseTo<Self, I, O, O2, E>
where Self: Sized, I: Stream, O: ParseSlice<O2>, E: ParserError<I>,

Apply std::str::FromStr to the output of the parser Read more
source§

fn verify<G, O2>(self, filter: G) -> Verify<Self, G, I, O, O2, E>
where Self: Sized, G: FnMut(&O2) -> bool, I: Stream, O: Borrow<O2>, O2: ?Sized, E: ParserError<I>,

Returns the output of the child parser if it satisfies a verification function. Read more
source§

fn context<C>(self, context: C) -> Context<Self, I, O, E, C>
where Self: Sized, I: Stream, E: AddContext<I, C>, C: Clone + Debug,

If parsing fails, add context to the error Read more
source§

fn complete_err(self) -> CompleteErr<Self>
where Self: Sized,

source§

fn err_into<E2>(self) -> ErrInto<Self, I, O, E, E2>
where Self: Sized, E: Into<E2>,

Convert the parser’s error to another type using std::convert::From

Auto Trait Implementations§

§

impl<P, I, O, C, E> RefUnwindSafe for Repeat<P, I, O, C, E>

§

impl<P, I, O, C, E> Send for Repeat<P, I, O, C, E>
where C: Send, E: Send, I: Send, O: Send, P: Send,

§

impl<P, I, O, C, E> Sync for Repeat<P, I, O, C, E>
where C: Sync, E: Sync, I: Sync, O: Sync, P: Sync,

§

impl<P, I, O, C, E> Unpin for Repeat<P, I, O, C, E>
where C: Unpin, E: Unpin, I: Unpin, O: Unpin, P: Unpin,

§

impl<P, I, O, C, E> UnwindSafe for Repeat<P, I, O, C, E>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.