Crate winnow

source ·
Expand description

winnow, making parsing a breeze

winnow is a parser combinator library

Quick links:

Aspirations

winnow aims to be your “do everything” parser, much like people treat regular expressions.

In roughly priority order:

  1. Support writing parser declaratively while not getting in the way of imperative-style parsing when needed, working as an open-ended toolbox rather than a close-ended framework.
  2. Flexible enough to be used for any application, including parsing binary data, strings, or separate lexing and parsing phases
  3. Zero-cost abstractions, making it easy to write high performance parsers
  4. Easy to use, making it trivial for one-off uses

In addition:

  • Resilient maintainership, including
    • Willing to break compatibility rather than batching up breaking changes in large releases
    • Leverage feature flags to keep one active branch
  • We will support the last 6 months of rust releases (MSRV, currently 1.60)

See also [Special Topic: Why winnow?][crate::_topic::why]

Example

Run

$ cargo add winnow

Then use it to parse:

use winnow::bytes::take_while_m_n;
use winnow::prelude::*;

#[derive(Debug, Eq, PartialEq)]
pub struct Color {
    pub red: u8,
    pub green: u8,
    pub blue: u8,
}

impl std::str::FromStr for Color {
    // The error must be owned
    type Err = winnow::error::Error<String>;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        hex_color.parse(s).map_err(winnow::error::Error::into_owned)
    }
}

pub fn hex_color(input: &str) -> IResult<&str, Color> {
    let (input, _) = "#".parse_next(input)?;
    let (input, (red, green, blue)) = (hex_primary, hex_primary, hex_primary).parse_next(input)?;

    Ok((input, Color { red, green, blue }))
}

fn hex_primary(input: &str) -> IResult<&str, u8> {
    take_while_m_n(2, 2, |c: char| c.is_ascii_hexdigit())
        .map_res(|input| u8::from_str_radix(input, 16))
        .parse_next(input)
}

See also the [Tutorial][_tutorial::chapter_0] and [Special Topics][_topic]

Re-exports

Modules

  • Bit level parsers
  • Choice combinators
  • Parsers recognizing bytes streams
  • Character specific parsers and combinators
  • List of parsers and combinators
  • Error management
  • Combinators applying their child parser multiple times
  • Parsers recognizing numbers
  • Core concepts available for glob import
  • Combinators applying parsers in sequence
  • Stream capability for combinators to parse
  • Parser execution tracing

Macros

Traits