chomp 0.3.1

A fast monadic-style parser combinator designed to work on stable Rust.
Documentation
# Change Log

All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).

## [0.3.1] - 2016-09-06

### Added

- `combinators::either`: Like `or` but allows different result types from the parsers.

### Changes

- Chomp is now licensed under both MIT and Apache-2.0 licenses.

### Bugfixes

- Feature `tendril` now compiles again.

## [0.3.0] - 2016-09-01

### 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]https://github.com/m4rw3r/debugtrace_rs. 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.

## [0.2.6] - 2016-07-07

### Bugfixes

- Macro expansion is now again compatible with nightly.
- Now uses `std` feature of conv dependency, fixing build breakage on rustc 1.2.0.

## [0.2.5] - 2016-03-08

### Added

- `combinators::bounded::sep_by`: Bounded version of `combinators::sep_by` and `combinators::sep_by1`.

### Changes

- Improved performance of combinators using iterators.
- Updated bitflags dependency

## [0.2.4] - 2016-01-24

### Changes

- **Backwards-incompatible:** `combinators::option` will now return the default value if the
  parser reports incomplete and the input is finite.

## [0.2.3] - 2016-01-21

### Added

- `buffer::StreamError` now implements `From<ParseError>`

### Changes

- **Backwards-incompatible:** `combinators::or` will now retry with the second parser if the
  first parser reports incomplete and the input is finite.
- Improvements to `parse!` macro to make it more general and to make it easier to write simple
  parsers as one line. Completely updated grammar and reimplemented the macro to include:

   * Alternation operator (`<|>`)
   * Skip operator (`<*`)
   * Then operator (`>>`)
   * `ret` and `err` can now be used inline
   * **Backwards-incompatible:** `;` is no longer allowed to terminate a `parse!` block.

## [0.2.2] - 2016-01-13

### Changes

* `Input::ret`, `ParseResult::bind` and `ParseResult::then` no longer have type parameter
  defaults. This change only affects people on nightly who have `type-parameter-defaults`
  enabled. See Rust [pull request #30724]https://github.com/rust-lang/rust/pull/30724.

## [0.2.1] - 2015-12-20

### Changes

* `buffer::GrowingBuffer` and `buffer::data_source::ReadDataSource` now derive `Debug`.
* Rustdoc for public items previously lacking any documentation.

## [0.2.0] - 2015-12-16

### Added

- `parse_only`: Runs a given parser on a finite input.
- `combinators::bounded::many`: combinator applying a parser within a range bound, storing the data
  in a `T: FromIterator`.
- `combinators::bounded::skip_many`: combinator applying a parser within a range bound, throwing
  away all produced data.
- `combinators::bounded::many_till`: combinator applying a parser within a range bound until a
  second parser succeeds. If the second parser does not succeed within the given range the parsing
  will fail. The matches from the first parser will be stored in a `T: FromIterator`.

### Changes

- `count`, `many1`, `sep_by1` now properly uses `Iterator::size_hint`
- **Backwards-incompatible:** `many`, `many1`, `sep_by`, `sep_by1`, `skip_many`, `skip_many1` are
  no longer considered incomplete if they end with a partial match as long as they have managed to
  satisfy the minimum count of matches.
- **Backwards-incompatible:** `buffer::ParseError` has been renamed to `buffer::StreamError` to not
  conflict with the simple `ParseError`.
- Slightly improved performance for `count`, `many`, `many1`, `sep_by`, `sep_by1`.

### Deprecated

- `Input::new`

  Use `parse_only` or `buffer::SliceStream` to parse a slice instead. For any advanced usage create
  an `Input` using `primitives::input::new`.

- `ParseResult::unwrap`, `ParseResult::unwrap_err`, `ParseResult::expect`

  Use `parse_only` or the `buffer::Stream` implementations to obtain a `Result` instead of acting
  on the `ParseResult` directly.

## [0.1.2] - 2015-12-02

### Added

- `ascii::digit`
- `ascii::is_end_of_line`
- `ascii::is_horizontal_space`
- `ascii::signed`
- `ascii::skip_whitespace`
- `combinators::look_ahead`
- `combinators::many_till`
- `combinators::matched_by`
- `combinators::sep_by1`
- `combinators::sep_by`
- `combinators::skip_many1`
- `parsers::peek_next`
- `parsers::run_scanner`
- `parsers::satisfy_with`

## [0.1.1] - 2015-11-28

### Added

- `parsers::Error::new`, useful for creating error values of unknown type.

## [0.1.0] - 2015-11-24

Initial release.