nom-exif 3.6.1

Exif/metadata parsing library written in pure Rust, both image (jpeg/heif/heic/jpg/tiff etc.) and video/audio (mov/mp4/3gp/webm/mkv/mka, etc.) files are supported.
Documentation
name: Rust

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

env:
  CARGO_TERM_COLOR: always

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Build
      run: cargo build --verbose
    - name: Add Android targets
      run: rustup target add armv7-linux-androideabi
    - name: Build for 32-bit target
      run: cargo build --target armv7-linux-androideabi --verbose
    - name: Run tests
      run: cargo test --verbose -- --nocapture
    - name: Run tests for all features
      run: cargo test --all-features --verbose -- --nocapture
    - name: Check formatting
      run: cargo fmt --check
    - name: Clippy
      run: cargo clippy -- -D warnings
    - name: Build documentation
      run: cargo doc --all-features

  fuzz:
    name: Fuzz smoke test
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Install nightly toolchain
      run: rustup toolchain install nightly --profile minimal
    - name: Install cargo-fuzz
      run: cargo install cargo-fuzz --locked
    - name: Run fuzz target (60s, seeded with testdata/)
      run: |
        mkdir -p fuzz/ci-corpus
        cargo +nightly fuzz run media_parser \
          fuzz/ci-corpus testdata \
          -- -max_total_time=60 -timeout=30
    - name: Upload crash artifacts on failure
      if: failure()
      uses: actions/upload-artifact@v4
      with:
        name: fuzz-crash
        path: fuzz/artifacts/
        if-no-files-found: ignore

  coverage:
    name: Code coverage
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Install llvm-tools-preview
      run: rustup component add llvm-tools-preview
    - name: Install cargo-llvm-cov
      uses: taiki-e/install-action@cargo-llvm-cov
    - name: Generate coverage (lcov)
      run: cargo llvm-cov --package nom-exif --all-features --lcov --output-path lcov.info
    - name: Enforce coverage threshold
      # cargo-llvm-cov 0.8.6 ignores --fail-under-lines when combined with
      # --lcov, so run a separate report-only invocation that actually
      # enforces the gate.
      run: cargo llvm-cov report --fail-under-lines 86 --text --output-path coverage.txt
    - name: Upload coverage to Codecov
      # Codecov upload is badge-only; the actual coverage gate is the
      # `Enforce coverage threshold` step above. fail_ci_if_error: false
      # prevents Codecov outages from breaking CI.
      uses: codecov/codecov-action@v5
      with:
        files: lcov.info
        flags: nom-exif
        fail_ci_if_error: false
        token: ${{ secrets.CODECOV_TOKEN }}