zerodds_hpack/lib.rs
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3
4//! Crate `zerodds-hpack`. Safety classification: **STANDARD**.
5//!
6//! HPACK (RFC 7541) Header-Compression-Codec fuer HTTP/2 — no_std,
7//! `forbid(unsafe_code)`. Implementiert die Wire-Schicht aus
8//! Variable-Length-Integer-Coding (§5.1), String-Literal-Coding
9//! (§5.2) inkl. statischem Huffman-Code (Appendix B), Static- und
10//! Dynamic-Table (§2.3, §4) sowie alle vier Header-Field-
11//! Repraesentationen (§6: Indexed / Literal-with-Indexing /
12//! Literal-without-Indexing / Literal-Never-Indexed).
13//!
14//! Spec: RFC 7541 §5 (Primitive Type Representations) + §6 (Binary
15//! Format).
16//!
17//! ## Schichten-Position
18//!
19//! Layer 5 — Bridges. Substrat fuer:
20//!
21//! - [`zerodds-http2`](../zerodds_http2/index.html) — RFC 9113
22//! Framing + Stream-State-Machine.
23//! - [`zerodds-grpc-bridge`](../zerodds_grpc_bridge/index.html) —
24//! gRPC-over-HTTP/2 Length-Prefixed-Message-Codec.
25//!
26//! ## Public API (Stand 1.0.0-rc.1)
27//!
28//! - [`Encoder`] / [`EncoderError`] — High-Level-Encoder mit eigener
29//! Dynamic-Table.
30//! - [`Decoder`] / [`DecoderError`] — High-Level-Decoder mit eigener
31//! Dynamic-Table und Size-Update-Handling.
32//! - [`Table`] / [`HeaderField`] / [`STATIC_TABLE`] /
33//! [`StaticTableEntry`] — Static- + Dynamic-Table-Modelle (§2.3).
34//! - [`encode_integer`] / [`decode_integer`] — Variable-Length-
35//! Integer-Coding-Primitive (§5.1).
36//! - [`encode_string`] / [`decode_string`] — String-Literal-Coding-
37//! Primitive (§5.2) mit optionalem Huffman-Pfad.
38//! - [`huffman::encode`] / [`huffman::decode`] /
39//! [`huffman::HuffmanError`] — Static-Huffman-Code aus Appendix B
40//! (Feature-gated nicht; ist fuer no_std erforderlich).
41//! - [`integer::IntegerError`] / [`string::StringError`] —
42//! Modul-private Fehler-Typen, ueber die Module-Pfade exposed.
43//!
44//! ## Beispiel
45//!
46//! ```rust
47//! use zerodds_hpack::{Decoder, Encoder, HeaderField};
48//!
49//! let mut encoder = Encoder::new();
50//! let mut decoder = Decoder::new();
51//!
52//! let headers = vec![
53//! HeaderField { name: ":method".into(), value: "GET".into() },
54//! HeaderField { name: ":scheme".into(), value: "https".into() },
55//! HeaderField { name: "custom-key".into(), value: "custom-value".into() },
56//! ];
57//!
58//! let wire = encoder.encode(&headers);
59//! let decoded = decoder.decode(&wire).expect("roundtrip");
60//! assert_eq!(decoded, headers);
61//! ```
62
63#![no_std]
64#![forbid(unsafe_code)]
65#![warn(missing_docs)]
66
67extern crate alloc;
68
69#[cfg(feature = "std")]
70extern crate std;
71
72pub mod decoder;
73pub mod encoder;
74pub mod huffman;
75pub mod integer;
76pub mod string;
77pub mod table;
78
79pub use decoder::{Decoder, DecoderError};
80pub use encoder::{Encoder, EncoderError};
81pub use integer::{decode_integer, encode_integer};
82pub use string::{decode_string, encode_string};
83pub use table::{HeaderField, STATIC_TABLE, StaticTableEntry, Table};