NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1864 most downloaded on crates.io
A parser library for humans with powerful error recovery
Last release 5 months ago
06 May 2026
Release timing varies
gaps range from 2 weeks to 10 months
Most releases are documented
notes for 13 of 21 stable releases
4 versions withdrawn
withdrawn after publishing
5 years old
34 releases · first in 2021
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
This is the first released version of chumsky 's 'zero-copy' rewrite.
This is the first released version of chumsky's 'zero-copy' rewrite.
This release has no precise changelog, although one will be added when 1.0.0 is eventually released in full form. For now, things are still fluctuating enough that a full changelog would inevitably be out of date in a few weeks.
This release has been over a year in development and represents the work of a lot of people. In particular:
This is the first alpha release. Do not expect a finished product: many minor API features are still incomplete, missing, or subject to change. Some documentation is incomplete, or still refers to concepts from past versions of the crate. In particular, the tutorial has not yet been updated. You may experience bugs, API footguns, and more issues besides. That said, we're releasing this version because we believe the core of the rewrite is ready to be exposed to users and we want to find out what problems there are and catch them before a full release.
We'd like folks to open issues if they find:
If you're an even awesome-er sort of person and you feel like contributing to the crate, there's still a lot of work that needs doing in the following areas:
All this aside, you'd be helping us out a bunch just by using this alpha release (especially porting existing chumsky parsers over to it) and telling us how you got on: what worked, what didn't work, what things you got stuck on or confused by, etc. If you'd like to give a more casual report like this, feel free to start a discussion.
Needless to say, the crate has received a substantial upgrade, overhauling virtually every aspect of its API. It's substantially more capable than it ever was, and now supports the following:
logos lexersOn top of all of that, we've worked really hard to push performance as far as we can using an innovative use of Generic Associated Types (GATs) internally that allows chumsky to automatically detect when an output is never used (such as with .then_ignore(...)) and avoid generating it all in the first place. You can find some technical details about this approach in Niko Matsakis' blog where they discuss chumsky.
Our work on performance has paid off: chumsky's JSON benchmark is now extremely competitive, beating out nom and others, and even banging on the door of more traditional hand-written JSON parsers.
In general, you can probably expect this new release to be several times faster than older releases for similar parsers. The JSON benchmark is about 12x faster.
Pushing zero-copy to the point of a release was always going to be a very long road to walk, but we're finally approaching the end. Thanks for using chumsky, and - if you're fortunate enough to have the resources and kind enough to consider donating them - please support the other contributors I listed at the top of this release!
select! and select_ref! now support cfg attributes.
select! and select_ref! now support cfg attributes.as_terminal and as_non_terminal on labels that will hide the internals for the debug infoRichReason can now be provided with an arbitrary RichReason::Custom type parameterConfigParser for OneOfRich::map_spanParser::map_err_withParser::filter_mapspin and sync feature flagsDisplay impl to render labels with instead of DebugCache API due to soundness issuesDefaultExpected::NothingElse to allow parsers that can never succeed to generate correct errorsContainer trait in favour of std's FromIterator, allowing .collect() to work with a greater range of typesLabelled -> LabelledWith conversion now carries over the proper debug settingsDefaultExpected::into_owned now has more permissive lifetime constraintsMapExtra::emit, which allows emitting secondary errors during mapping operations
MapExtra::emit, which allows emitting secondary errors during mapping operationsInputRef::emit, which allows emitting secondary errors within custom parserslabelled_with, which avoids the need to implement Clone for labelsInput::split_token_span, a convenience function for splitting (Token, Span) inputs so that chumsky can understand themInput::split_spanned, which does the same as above, but for implementors of WrappingSpanspanned, a combinator which automatically annotates a parser output with a spanIterParser::parse_iter, a way to turn an IterParser (like x.repeated()) into an iteratorParser::debug, which provides access to various parser debugging utilities.nested_in more flexible by allowing it to map between different input types instead of requiring the same input as the outer parsernested_inImplement Default, PartialOrd, and Ord for SimpleSpan
Default, PartialOrd, and Ord for SimpleSpanPartialOrd and Ord for RichPatched compilation error that only appeared in release builds
Make whitespace parsers reject codepoints that are vulnerable to CVE-2021-42574
set(...) combinator, which may be used to conveniently parse a set of patterns, in any order.pratt(...) combinatorParser::try_foldl, allowing folding operations to short-circuit in a manner similar to Parser::try_mapParser::contextual, which allows a parser to be disabled or enabled in a context-sensitive mannerValueInput for IterInput, which was previously missingState trait:
RollbackState, which reverts parser state when a parser rewinds and may be used to, for example, count the number of times a pattern appears in the inputTruncateState, which truncates a vector when a parser rewinds, and may be used to implement an arena allocator for AST nodesIterParser for a.then(b) when both a and b are both IterParsers that produce the same output typerecursive and ParserExtra more permissiveParser::filter now generates a DefaultExpected::SomethingElse label instead of nothing (this can be overridden with the .labelled(...) function)select! parser more permissive, accepting any implementor of Input instead of requiring ValueInput tooParser::try_map).rewind() parser no longer rewinds any secondary error that were encounteredtext::ascii::keyword lifetime regressionImplemented Container for VecDeque
Container for VecDequeBoxed types now have a default type parameter of extra::Default, like Parser and IterParser0.10 and has been moved to the guide1.0.0 has been in development for a long time, and there are still some breaking changes left to make (although we're getting closer!). Users wants to…
The 0.10.0 release of chumsky is a from-scratch rewrite of the crate based on the work that's been ongoing for several years in the 1.0.0 alpha builds. The release of 0.10.0 is, in many ways, a concession to a few inconvenient facts:
We recommend that users of chumsky depend on 0.10.0, if they can. Despite that, there are a few things to consider:
Any help from the community to assist in resolving these points is greatly appreciated!
Here follows the changelog for 0.10.0. I also wrote up an informal migration guide.
IterParser, that allows expressing parsers that generate many outputsimpl Readers, iterators, etc.pratt parser combinator, allowing for conveniently and simply creating expression parsers with precise operatorregex combinator, allowing the parsing of terms based on a specific regex patternParser::then_with has been removed in favour of the new context-sensitive combinatorsNote: version 0.10 is a from-scratch rewrite of chumsky with innumerable small changes. To avoid this changelog being longer than the compiled works of Douglas Adams, the following is a high-level overview of the major feature additions and does not include small details.
IterParser, that allows expressing parsers that generate many outputsimpl Readers, iterators, etc.pratt parser combinator, allowing for conveniently and simply creating expression parsers with precise operator
precedenceregex combinator, allowing the parsing of terms based on a specific regex patternParser::then_with has been removed in favour of the new context-sensitive combinatorsNothing published for this version
Properly fixed skip_then_retry_until regression
skip_then_retry_until regressionRegression in skip_then_retry_until recovery strategy
skip_then_retry_until recovery strategyA semantic_indentation parser for parsing indentation-sensitive languages. Note that this is likely to be deprecated/removed in the future in favour o…
spill-stack feature that uses stacker to avoid stack overflow errors for deeply recursive parsersselect! like select! { |span| Token::Num(x) => (x, span) }skip_parser recovery strategy that allows you to implement your own recovery strategies in terms of other.recover_with(skip_parser(take_until(just(';')))) skips tokens until after the next semicolonnot combinator that consumes a single token if it is not the start of a given pattern. For example,just("\\n").or(just('"')).not() matches any char that is not either the final quote of a string, and is not thesemantic_indentation parser for parsing indentation-sensitive languages. Note that this is likely to be#[must_use] attribute for parsers to ensure that they're not accidentally created without being usedOption<Vec<T>> and Vec<Option<T>> now implement Chain<T> and Option<String> implements Chain<char>choice now supports both arrays and vectors of parsers in addition to tuplesSimple error type now implements Eqtext::whitespace returns a Repeated instead of an impl Parser, allowing you to call methods like at_least andexactly on it.no_std supportDisplay implementations for various built-in error types and SimpleReasonOrderedContainer trait to avoid unexpected behaviour for unordered containers in combination with justtodo, unwrapped, etc.) more useful by reporting the parser's location on panicthen_with combinator to allow limited support for parsing nested patterns
then_with combinator to allow limited support for parsing nested patternsSkipUntil/SkipThenRetryUntil::skip_start/consume_end for more precise control over skip-based recoveryValidate to map the output typeStreamdelimited_by take combinators instead of specific tokens--no-default-featuresskip_until more sensibleDeprecated seq (just has been generalised and can now be used to parse specific input sequences)
A new tutorial to help new users
select macro, a wrapper over filter_map that makes extracting data from specific tokens easy
choice parser, a better alternative to long or chains (which sometimes have poor compilation performance)
todo parser, that panics when used (but not when created) (akin to Rust's todo! macro, but for parsers)
keyword parser, that parses exact identifiers
from_str combinator to allow converting a pattern to a value inline, using std::str::FromStr
unwrapped combinator, to automatically unwrap an output value inline
rewind combinator, that allows reverting the input stream on success. It's most useful when requiring that a
pattern is followed by some terminating pattern without the first parser greedily consuming it
map_err_with_span combinator, to allow fetching the span of the input that was parsed by a parser before an error
was encountered
or_else combinator, to allow processing and potentially recovering from a parser error
SeparatedBy::at_most to require that a separated pattern appear at most a specific number of times
SeparatedBy::exactly to require that a separated pattern be repeated exactly a specific number of times
Repeated::exactly to require that a pattern be repeated exactly a specific number of times
More trait implementations for various things, making the crate more useful
just, one_of, and none_of significant more useful. They can now accept strings, arrays, slices, vectors,
sets, or just single tokens as beforeseq (just has been generalised and can now be used to parse specific input sequences)Character trait so that future changes are not breakingChain trait and made it more powerfulParser to where clauses for improved readabilityseparated_by to parse an extra trailing separator when it shouldn'tError trait's API that conflated a lack of expected tokens with expectation of end of inputskip_until error recovery strategy
skip_until error recovery strategySeparatedBy::at_least and SeparatedBy::at_most for parsing a specific number of separated itemsParser::validate for integrated AST validationRecursive::declare and Recursive::define for more precise control over recursive declarationsseparated_by error messagesNothing published for this version
Added span to fallback output function in nested_delimiters
take_until primitivenested_delimitersNothing published for this version
Nothing published for this version
Custom error recovery strategies
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →