parse-net 0.3.0

Grammar for Internet message fields: RFC 9110 field syntax, media types, RFC 9651 Structured Fields, HTTP and RFC 5322 dates, negotiation, entity tags, ranges, Content-Disposition, Cache-Control, Forwarded, auth challenges, and the email lexical layer. no_std, no allocation, sans-IO, zero dependencies.
Documentation
# parse-net v0.2.0 - Design Lock

**Date:** 2026-10-22
**Compare:** [`v0.1.0...v0.2.0`](https://github.com/jamesgober/parse-net/compare/v0.1.0...v0.2.0)

**The public API, written down before the code.** v0.2.0 locked every name, signature, behaviour, and error of parse-net from `0.3.0` to `1.0.0` in [`docs/API.md`](https://github.com/jamesgober/parse-net/blob/main/docs/API.md), and checked it against what each consumer crate needs. There is no parsing code in this release; `0.3.0` builds the core against this contract.

## What's in 0.2.0

- **`docs/API.md`.** Every public item, grouped by module: byte classes, scanning, numbers, writers and sinks, tokens and quoted strings, lists and combined field lines, parameters, media types, content negotiation, HTTP and RFC 5322 dates, entity tags, ranges, RFC 8187 values, `Content-Disposition`, `Cache-Control`, `Link`, `Forwarded` and `X-Forwarded-*` with trusted-proxy resolution, `Authorization` and challenges, `Host`, `Origin`, percent-encoding, Structured Field Values, and the email lexical layer. Each item carries its id, grade (P0 to P3), tier (1 to 3), the version that ships it, its signature, its behaviour with the RFC section behind it, every `ErrorKind` it can return, examples, and the edge cases its tests will cover.
- **One error vocabulary.** The `ErrorKind` table names, for every variant, what was refused and what the caller should do; `ParseError` stays 8 bytes and never carries input bytes.
- **Limits with sources.** Every `Limits` default is listed with the RFC minimum it meets, so a conforming sender is never refused by default.
- **Consumer checklists.** One table each for http-net, ws-net, cookie-net, form-net, and smtp-net, mapping what the crate does today (or what its specification asks for) to the parse-net item that replaces it, with every behaviour change named: http-net's host check becomes stricter, ws-net's list split becomes quote-aware, form-net's browser-style quoting is served by `Quoted::raw` without a second parser.
- **Decisions D-026 to D-036** in `dev/PLAN.md`: ISO weekday numbering, a public `ParseError::new` for visitor implementors, no second quoting mode for `multipart/form-data`, `WriteError::InvalidSequence` for structured writers, the Structured Field Date range, `@` checked first in `Host` so userinfo is never reported as a bad port, `mail::unfold` validating before it iterates, `If-Range` dates as IMF-fixdate, the RFC 5322 obsolete-year rule, and the names added beyond the specification's sketch.

## Verification

- Local gate on Windows and WSL Ubuntu, Rust 1.99 and 1.85: format, clippy in three feature modes, tests in three modes, documentation with default and all features, the bare-metal `thumbv7em-none-eabi` build, and `cargo package` in a fresh target directory.
- Every link and anchor in the documentation checked; banned-content scan clean.
- CI green on every platform before the tag.

## What's next

`0.3.0` ships the core that http-net, ws-net, and cookie-net need: errors, limits, byte classes, scanning, numbers, writers, tokens, quoted strings, lists, parameters, media types, HTTP dates, `Host`, and percent-encoding, each with unit tests, property tests, fuzz targets, and counting-allocator tests, plus `docs/MIGRATION.md` for the http-net and ws-net maintainers.

**Full Changelog:** https://github.com/jamesgober/parse-net/compare/v0.1.0...v0.2.0