# qlog/
qlog data model for QUIC and HTTP/3 per IETF drafts (`draft-ietf-quic-qlog-main-schema`, `draft-ietf-quic-qlog-quic-events`, `draft-ietf-quic-qlog-h3-events`). Pure data types + serde serialization; no IO (deferred to consumers).
## STRUCTURE
```
src/
lib.rs # Core types: Qlog, QlogSeq, Trace, TraceSeq, VantagePoint, Configuration, Error
streamer.rs # QlogStreamer -- streaming JSON-SEQ writer with state machine
reader.rs # QlogSeqReader -- streaming JSON-SEQ reader/iterator
events/
mod.rs # Event, EventData (giant enum), EventType, Eventable trait, EventImportance
quic.rs # QUIC event types (packet_sent, packet_received, frames, etc.)
h3.rs # HTTP/3 event types
qpack.rs # QPACK event types
connectivity.rs # Connection-level events (state changes, path updates)
security.rs # TLS/crypto events
testing/
mod.rs # Test helpers
event_tests.rs
trace_tests.rs
```
## WHERE TO LOOK
| Add new event variant | `events/mod.rs` `EventData` enum | Add to relevant `events/*.rs`, wire into `EventData` |
| Modify serialization | `lib.rs` | Heavy `serde_with` usage; `#[serde(rename)]` everywhere |
| Streaming output | `streamer.rs` | `QlogStreamer` writes JSON-SEQ (RFC 7464) via `Write` trait |
| Parse qlog files | `reader.rs` | `QlogSeqReader` iterates events from `BufRead` |
| `Eventable` trait | `events/mod.rs:310` | Requires `importance()` and event name; impl on all event enums |
| Two output modes | `lib.rs` | Buffered (`Qlog`/`Trace`) vs streaming (`QlogSeq`/`TraceSeq`) |
## NOTES
- Deps: `serde`, `serde_json` (preserve_order), `serde_with`, `smallvec`. No async, no IO beyond `Write`/`BufRead`.
- `EventData` is a massive enum (~200 variants) spanning all protocol categories. Grep, don't scroll.
- JSON field names follow IETF draft conventions (`snake_case`), mapped via `#[serde(rename)]`.
- `serde_json::preserve_order` keeps field insertion order in output.
- `HexSlice` helper for hex-encoding byte arrays in JSON.
- No feature flags.