Gunnar

nordisk/znippy-zoomies

.nornir/lbzip2-readers-guide.md

# lbzip2 library readers — guide

> **Class:** `guide` · **Function:** `lbzip2-readers`. How to call the three bzip2
> library twins. Shape in [`lbzip2-readers-design.md`](lbzip2-readers-design.md); the
> CLI in [`lbunzip2-guide.md`](lbunzip2-guide.md).

## Build

```sh
CARGO_TARGET_DIR=/mnt/work4t/cargo-target/zoomies cargo build --release -p lbzip2
```

## Pick a reader

```rust
use std::io::Read;

// 1. Whole slice in, whole Vec out (you already have the bytes, want it all):
let out: Vec<u8> = lbzip2::parallel::decompress_parallel(&bytes)?;   // parallel.rs:15

// 2. Read-trait streaming over any Read source (bounded memory, 100 MB chunks):
let mut r = lbzip2::reader::StreamingBz2Read::new(file)?;            // reader.rs:30
let mut xml = Vec::new();
r.read_to_end(&mut xml)?;

// 3. Read-trait over an mmap'd / in-memory slice (64-block batches):
let mut r = lbzip2::reader::ParallelBz2Read::new(&mmap)?;            // reader.rs:205
```

## When to use which

- **`decompress_parallel`** — you hold the whole `.bz2` and want the whole output; the
  fastest, but resident memory is the full decompressed size.
- **`StreamingBz2Read`** — a `Read` source (socket, pipe, file) and bounded memory
  matters; only one ~100 MB chunk's decoded output is live at once.
- **`ParallelBz2Read`** — an mmap'd file you want to stream through `Read` without
  materialising all output; decodes in 64-block batches.

All three read anything `bzip2`/`lbzip2`/`pbzip2` wrote and CRC-check every block.

## Bench

These share the `lbzip2` crate benches (`cargo bench -p lbzip2`); the headline
head-to-head is the CLI in the README A/B/C mashup — see
[`decompressors-guide.md`](decompressors-guide.md).