nom-exif 3.0.0 unifies image and media metadata parsing in Rust
nom-exif 3.0.0 turned a pile of format-specific wrappers into one MediaParser path, with pure-Rust parsing for image EXIF and media track metadata.

nom-exif 3.0.0 is less a tune-up than a reroute. The crate now centers everything on one MediaParser interface, so a caller can inspect the MIME type, then hand image EXIF or media track parsing off to the same Rust layer instead of juggling separate wrappers for every format. That matters because nom-exif is trying to be the boring, dependable kind of infrastructure code: pure Rust, no FFmpeg, no libexif, no system dependencies, and clean cross-compilation across the targets Rust developers actually ship.
The format list is broad enough to make the redesign feel practical rather than academic. Current docs cover JPEG, HEIC, TIFF, CR3, RAF, IIQ, AVIF, and PNG on the image side, while MP4, MOV, WebM, MKV, 3GP, and MKA are included for container metadata. Motion Photos from Pixel, Google, and Samsung are detected automatically when an MP4 trailer is embedded, and parse_track can peel out the video metadata without forcing the caller into a separate code path. That one-parser workflow is the real change here: MediaKind plus parse_exif or parse_track replaces the old habit of stitching together format-specific glue.

The v3 design also opens up the input side. nom-exif can read from a file path, from any Read or Read+Seek source, or from zero-copy byte slices through MediaSource::from_bytes. That gives the crate a better fit for WASM, mobile, proxy services, and streaming pipelines where copying a giant buffer is exactly the wrong move. The API split between active and lazy views is just as useful in practice. One gives immediate EXIF access; the other uses an iterator so a bad entry can surface as a per-item error without blowing up the whole parse.

The implementation plan makes clear this was engineered as a real v3 cut, not a cosmetic release. The public surface was meant to grow from about 16 leaking v2.x symbols to about 29 deliberate v3 symbols, while the minimum supported Rust version moved from 1.80 to 1.83. Error handling also got sharper, replacing boxed errors with structured variants such as malformed input, unexpected EOF, and unsupported format. Add reusable buffers, shared byte storage via bytes::Bytes, fuzz testing with cargo-fuzz, and a 60-second fuzz smoke-test job in CI, and 3.0.0 starts to look like the point where nom-exif stopped being a useful parser and became a sturdier parsing foundation.
Know something we missed? Have a correction or additional information?
Submit a Tip
