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

pub use error::FinishIResult;
Deprecated
pub use error::IResult;
pub use stream::BStr;
pub use stream::Bytes;
pub use stream::Located;
pub use stream::Partial;
pub use stream::Stateful;
pub use stream::Str;

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

match for parsers

Traits

Core trait for parsing