winnow::combinator

Struct 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(&mut self, input: I) -> Result<O, ParseError<I, E>>
where Self: Sized, I: Stream + StreamIsPartial, E: ParserError<I>,

Parse all of input, generating O from it
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 take(self) -> Take<Self, I, O, E>
where Self: Sized, I: Stream,

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

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

👎Deprecated since 0.6.14: Replaced with Parser::take
Replaced with Parser::take
Source§

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

Produce the consumed input with the output Read more
Source§

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

👎Deprecated since 0.6.14: Replaced with Parser::with_taken
Replaced with Parser::with_taken
Source§

fn span(self) -> Span<Self, I, O, E>
where Self: Sized, I: Stream + Location,

Produce the location of the consumed input as produced value. Read more
Source§

fn with_span(self) -> WithSpan<Self, I, O, E>
where Self: Sized, I: Stream + Location,

Produce the location of 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 and_then<G, O2>(self, inner: G) -> AndThen<Self, G, I, O, O2, E>
where Self: Sized, G: Parser<O, O2, E>, O: StreamIsPartial, I: Stream,

Applies a second parser over the output of the first 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> Freeze for Repeat<P, I, O, C, E>
where P: Freeze,

§

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 P: Send, I: Send, O: Send, C: Send, E: Send,

§

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

§

impl<P, I, O, C, E> Unpin for Repeat<P, I, O, C, E>
where P: Unpin, I: Unpin, O: Unpin, C: Unpin, E: 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>,

Source§

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>,

Source§

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.

Layout§

Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.