NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #71 most downloaded on crates.io
A byte-oriented, zero-copy, parser combinators library
Last release 2 months ago
13 Jul 2026
Release timing varies
gaps range from 8 days to 3 months
Nearly every release is documented
notes for 56 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
111 releases · first in 2023
One column per quarter.
chore: Release winnow version 1.0.4
chore: Release winnow version 1.0.4
chore: Release winnow version 1.0.3
chore: Release winnow version 1.0.3
chore: Release winnow version 1.0.2
chore: Release winnow version 1.0.2
chore: Release winnow version 1.0.1
chore: Release winnow version 1.0.1
chore: Release winnow version 1.0.0
chore: Release winnow version 1.0.0
Note: going to v1 is more a reflection of the rate of churn in Winnow's API than the quality of previous releases or any statement against future breaking changes.
ascii, binary, or parser features as neededalt tuples into tuples of alt tuples as neededparser, ascii, and binary feature gates to improve build times(I, usize) with binary::bits::Bits to clarify intentBitOffsets from stream to binary::bits to consolidate the APIiterator impure like parsersStream::raw with Stream::traceBuild time
parser, ascii, and binary featuresRuntime
hex_uintParser::parse_iterNeeded in streamoct_digit1escaped into a Cowescaped, take_escaped control character for not-quite unicode parsingchore: Release winnow version 0.7.15
chore: Release winnow version 0.7.15
combinator::permutation in favor of combinator::unordered_seq!combinator::unordered_seq!, like seq! but where the order of values does not matterchore: Release winnow version 0.7.14
chore: Release winnow version 0.7.14
combinator::expression parser for parsing expressions with precedence (a pratt parser)chore: Release winnow version 0.7.13
chore: Release winnow version 0.7.13
String into StringCow<str> into Stringchore: Release winnow version 0.7.12
chore: Release winnow version 0.7.12
Remove a stackoverflow in PartialEq and PartialOrd with Bytes and BStr
PartialEq and PartialOrd with Bytes and BStrAdded Stream::trace for better customization of trace parsers
Stream::rawStream::trace for better customization of trace parsersinitial from TokenSlice / LocatingSlices Debug implStream::trace prints non-pretty output for &[T] and TokenSlice<T>### Features - Add ContextError::extend - Add Parser::context_with
ContextError::extendParser::context_with### Features - Add ContextError::push - Add Parser::map_err
ContextError::pushParser::map_errEnsure LocatedSlice and Statefuls Stream::raw gets the inner input
LocatedSlice and Statefuls Stream::raw gets the inner inputAdd TokenSlice::previous_tokens
TokenSlice::previous_tokensAdd Stream::next_slice_unchecked and Stream::peek_slice_unchecked
Stream::next_slice_unchecked and Stream::peek_slice_unchecked*(tutorial)* Iterate on how we discuss errors
emptydispatch!### Features - Add ParseError::char_span
ParseError::char_span### Fixes - Make Range Copyable
Range CopyableDon't panic when calling .next(), .next(), .finish() on iterator
.next(), .next(), .finish() on iteratorDeprecated functionality removed
impl Parser<_, _, _> with impl ModalParser<_, _, _>from_error_kind to from_input and remove other kind parametersseq!(<tuple>), you may need to add mut to shared parsersStream::peek* calls, update for lack of Stream being returnedModalParser couldn't be used, change Parser<I, O, E> to Parser<I, O, ErrMode<E>>If you do not use cut_err or Partial, you can further clean up the code and improve performance by removing the use of ErrMode
ModalResult<O, E> with winnow::Result<O> (if using default error type) or just Result<O, E>impl ModalParser with impl ParserErrModeescaped and take_escaped now assert, rather than stop, on empty normal outputseq(<tuple>) must now be mutStream::peek_token, Stream::peek_slice, Stream::peek_finish no longer return a clone of Streamtrait Locations functions have changed to improve parsing of lexed tokensParserError::append and FromExternalError::from_external_errors kind parameter has been removedParserError, AsChar, ContainsToken, Stream were added to the preludeescaped_transform in favor of the new name escapedErrMode from the core traits through new ModalError trait and ParserError modal functions, allowing better performance and greater flexibilityParserError, AsChar, ContainsToken, Stream to the preludestream::TokenSlice to help parsing of lexed tokensErrorConvert for ErrModeseq!(<tuple>) so they can be used multiple timesescaped and take_escaped now assert, rather than stop, on empty normal outputParser::by_ref, Parser::complete_errfloatParserError::append to reduce boilerplate with custom errorsTreeError with binary::bits parsersescaped can now have separate types for normal and escaped parsersDeprecate ParserError::from_error_kind in favor of ParserError::from_input
ParserError::from_error_kind in favor of ParserError::from_inputInputError::new in favor of InputError::atErrorKind
EmptyErrorParserError::append, just add an #[allow(deprecated)]EmptyError which is like () but compatible with Parser::parseParserError::from_input to help with the transition to 0.7InputError::at to help with the transition to 0.7Deprecated PResult in favor of ModalResult: v0.7 will make ErrMode optional and PResult will no longer be descriptive enough
PResult in favor of ModalResult: v0.7 will make ErrMode optional and PResult will no longer be descriptive enoughIResult in favor of PResult<(I, O)>repeat(_).fold(1..)Add back in winnow::Located which was removed by accident
winnow::Located which was removed by accidentstream::Located is deprecated in favor of stream::LocatingSlice
stream::Located is deprecated in favor of stream::LocatingSlicecombnator::rest is deprecated in favor of token::restcombnator::rest_len is deprecated in favor of token::rest_lencombinator::<Struct> have mostly been deprecated in favor of combinator::impls::<Struct>unpeek is deprecatedrepeat().try_fold() and repeat().verify_fold()Respect is_partial in take_till
is_partial in take_tillClarify roles of peek and Parser::parse_peek
peek and Parser::parse_peeknom### Internal - Dependency update
Add Located::reset_to_start for parsing encoded graphs with start-relative pointers
Located::reset_to_start for parsing encoded graphs with start-relative pointersNothing published for this version
### Features - Make Checkpoints comparable
Checkpoints comparableNothing published for this version
Deprecated Parser::recognize in favor of Parser::take
Parser::recognize in favor of Parser::takeParser::with_recognized in favor of Parser::takenParser::recognize to Parser::take to be consistent with other take parsersParser::with_recognized to Parser::with_taken to be consistent with other take parsersRemoved unused I: Clone bound on Parser::parse
I: Clone bound on Parser::parse### Documentation - Expand on error reporting
Improve compilation errors when using non-parsers with seq! struct syntax
seq! struct syntaxRemove AsBytes bounds, unblocking parsing frames of binary input
AsBytes bounds, unblocking parsing frames of binary inputExtend seq! to constructing enum variants
seq! to constructing enum variantsAdd Debug impls for stream::Stateful and stream::Recoverable
Debug impls for stream::Stateful and stream::RecoverableSupport &mut [impl Parser] within alt
&mut [impl Parser] within altImprove debug traces when Input wrapper types are used
Add impl ErrorConvert for ContextError so it can be used with bit parsing
ErrorConvert for ContextError so it can be used with bit parsingDeprecated escaped in favor of take_escaped (rename)
escaped in favor of take_escaped (rename)inputProvide examples of concrete signatures
Make take_until("") consistent between simd or not, with or without empty buffer
take_until("") consistent between simd or not, with or without empty buffer*until and *till parsersNothing published for this version
Fix regression where dec_int / dec_uint didn't parse 0
dec_int / dec_uint didn't parse 0Nothing published for this version
Add support to take_until for char needles on &[u8] haystacks
take_until for char needles on &[u8] haystacksBe consistent about inlining slice_len
slice_lenDeprecate token::tag for token::literal
token::tag for token::literalbinary::bits::tag for binary::bits::patternu8) to be a tagtoken::tag as token::literalbinary::bits::tag as binary::bits::patternInitial support for error recovery behind unstable-recover feature
unstable-recover featureDeprecate fold_repeat in favor of repeat().fold()
fold_repeat in favor of repeat().fold()repeat().fold()Deprecate success(value) in favor of empty.value(value)
success(value) in favor of empty.value(value)winnow::trace::trace in favor of the more centrally located winnow::combinator::tracetake_until0 / take_until1 in favor of take_untilrepeat_till0 in favor of repeat_tillnot_line_ending in favor of till_line_endingempty combinatortake_until that can handle any range of tokens to consumerepeat_till that can handle any range of parsers to repeatcut_err and how to use ittrace documentation into the tutorialDon't require Statefuls State to be clone (a leftover from pre &mut input)
Statefuls State to be clone (a leftover from pre &mut input)Support char with tag parser which is faster than using one_of
char with tag parser which is faster than using one_ofParse +/- inf/nan with ascii::float
+/- inf/nan with ascii::floatHelp the optimizer trim unused instructions in any when parsing a complete buffer
any when parsing a complete buffer### Features - Add Parser::default_value
Parser::default_valueNew combinator::seq! for easier initialization of structs/tuples
combinator::seq! for easier initialization of structs/tuplesYour coding agent can read these notes before it upgrades. Set up the MCP server →