Performance First
Latest local Criterion means (cargo bench, Windows x86_64, Rust stable). The workload that matters in a test suite is the check on the matching path — the case a green suite runs on every pass:
- Capture (
per_line, 16 lines): ~0.5 µs - Check, matching (16 lines): ~1.2 µs
- Check, matching (256 lines): ~19 µs
The check is a line-level diff with a common prefix/suffix fast path: identical leading and trailing lines are matched in linear time before the quadratic LCS engine runs, so a near-miss snapshot only pays for the region that actually changed.
Installation
[]
= "1"
no_std + alloc (drops the std::error::Error anchor, keeps everything else):
[]
= { = "1", = false }
Quick Start
Snapshot a token stream, one token per line, and assert it:
use Snapshot;
// Whatever your lexer produces — here a stand-in that yields display strings.
let snapshot = per_line;
snapshot.check.expect;
When the output drifts, the returned Mismatch shows precisely what changed:
use Snapshot;
let snapshot = per_line;
let err = snapshot.check.unwrap_err;
// `-x` was expected; `+y` was produced in its place.
assert!;
assert!;
Features
- Three capture modes —
Snapshot::displayfor aDisplayvalue,Snapshot::debugfor a pretty-printedDebugtree, andSnapshot::per_linefor a token stream (one item per line, so the diff points at the exact token). - Cross-platform normalization — CRLF/CR collapse to LF, trailing whitespace is stripped, and trailing blank lines are trimmed. A snapshot written by hand in a test matches output captured on any platform.
- Line-level diffs — a failed
checkreturns aMismatchwhoseDisplayis a unified-expected/+actualdiff;Mismatch::diffexposes theDifffor programmatic inspection. - No runtime dependencies — built on
core::fmtandalloconly.no_stdcapable. - No panics —
checkreturnsResult; the test author decides whether tounwrap,expect, or propagate.
API Overview
For a complete reference with examples, see docs/API.md.
Snapshot— a normalized, comparable rendering of compiler output;new/display/debug/per_line/check.Diff&Change— the line-level edit script, rendered as a unified diff.Mismatch— the error returned bySnapshot::check, carrying theDiff.
Runnable examples: examples/tokens.rs, examples/ast.rs, examples/diagnostics.rs.
Contributing
See REPS.md for engineering standards and the definition of done. Before a PR: cargo fmt --all, cargo clippy --all-targets --all-features -- -D warnings, and cargo test --all-features must be clean.