mtb-align 0.1.0

Median threshold bitmap alignment for handheld HDR exposures
Documentation
name: Rust

on:
  push:
    branches: [main]
  pull_request:

env:
  CARGO_TERM_COLOR: always
  RUSTFLAGS: -D warnings

permissions:
  contents: read

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt, clippy
      - uses: Swatinem/rust-cache@v2

      - run: cargo fmt --all --check
      - run: cargo clippy --all-targets --all-features
      - run: cargo doc --no-deps

  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        features: ["", "rayon"]
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2

      - run: cargo test --features "${{ matrix.features }}"
      - run: cargo build --examples --features "${{ matrix.features }}"

  fixtures:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: astral-sh/setup-uv@v9.0.0

      - run: uv run --with opencv-python-headless --with numpy tests/fixtures/generate.py
      - name: Fixtures match regenerated output
        run: git diff --exit-code tests/fixtures/opencv.txt

  release-please:
    needs: [check, test, fixtures]
    if: github.event_name == 'push'
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
    outputs:
      released: ${{ steps.release.outputs.release_created }}
    steps:
      - uses: googleapis/release-please-action@v5
        id: release
        with:
          config-file: release-please-config.json
          manifest-file: .release-please-manifest.json

  publish:
    needs: release-please
    if: needs.release-please.outputs.released == 'true'
    runs-on: ubuntu-latest
    environment:
      name: crates-io
      url: https://crates.io/crates/mtb-align
    permissions:
      contents: read
      id-token: write
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable
      - uses: rust-lang/crates-io-auth-action@v1
        id: auth
      - env:
          CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
        run: |
          version=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')
          if curl -sfo /dev/null -H "User-Agent: mtb-align-ci" "https://crates.io/api/v1/crates/mtb-align/$version"; then
            echo "mtb-align $version is already published"
          else
            cargo publish
          fi