chomp v0.3.0 Release Notes

Release Date: 2016-09-01 // over 7 years ago
  • ➕ Added

    📜 prelude module containing basic types, parsers and combinators.

    📦 This is supposed to be the equivalent of Attoparsec's main package.

    📜 run_parser which executes a parser on any given Input type.

    buffer::InputBuf which contains a slice and an incomplete flag, much as the old Input struct.

    Input<Token=T, Buffer=&[T]> implementation for &[T] where T: Copy + PartialEq.

    Input<Token=char, Buffer=&str> implementation for &str.

    types::Buffer trait which is implemented for all buffers providing common logic to perform the
    📜 final parsing on a buffer without knowing the exact buffer implementation.

    types::U8Input trait alias for Input<Token=u8>.

    primitives::Primitives trait providing access to the primitive methods of the Input trait.

    🏗 This is used for building fundamental parsers/combinators.

    📜 ParseResult::inspect allowing code to observe the success value.

    types::numbering module for creating position-aware Input types.

    📜 parsers::skip_while using an efficient way of skipping data if provided, otherwise falls back
    on using take_while and throws the result away.

    🏗 chomp::Error now includes a backtrace in test and debug build profiles thanks to the
    debugtrace crate. Backtraces can also be activated
    permanently using the backtrace feature but this will incur the significant cost of allocating
    🚀 backtraces even in the release profile.

    🔋 Feature noop_error provides a zero-sized error type for the cases when the expected token is
    🐎 unimportant. Provides a small performance boost.

    🔄 Changes

    Backwards-incompatible: Input is now a trait with associated types Token and Buffer.

    🚚 This removes all incomplete logic from the parsers themselves and moves it into the InputBuf
    📜 type. This InputBuf is used if a partial buffer is in memory. It also allows the parsers to
    operate directly on slices or use more effective means of storing buffers depending on the
    Input implementation.

    ⬆️ To upgrade you replace the previous concrete Input type with a generic, use its associated
    📜 type if required, and refer to the Buffer associated type to allow for zero-copy parsing::

    -fn http_version(i: Input<u8>) -> U8Result<&[u8]>;
    +fn http_version<I: Input<Token=u8>>(i: I) -> SimpleResult<I, I::Buffer>;
    

    The associated types can be restricted if requried:

    fn request<I: U8Input>(i: I) -> SimpleResult<I, (Request<I::Buffer>, Vec<Header<I::Buffer>>)>
      where I::Buffer: ::std::ops::Deref<Target=[u8]>;
    

    Backwards-incompatible: Moved types into a more logical module structure, prelude now
    exists as a prelude module.

    Backwards-incompatible: chomp::Error is no longer an enum, this is to facillitate the
    👌 support of backtraces while keeping code compatible between the different build profiles.

    👉 Use chomp::Error::expected_token to determine if a specific token was expected.

    🔋 Feature verbose_error is now default

    ✂ Removed

    • Input::incomplete
    • Input::new
    • 📜 ParseResult::expect
    • 📜 ParseResult::unwrap_err
    • 📜 ParseResult::unwrap
    • buffer::IntoStream
    • 👯 primitives::InputClone
    • primitives::State

    🛠 Bugfixes

    • 📜 combinators::bounded now have a defined behavior when a Range<usize> has start == end: They will parse exactly start times. This also fixed a few overflows and unreachable code being reachable.
    • 🛠 combinators::bounded::many_till got fixed for an overflow happening when 0: usize was used to limit the number of iterations.