name: 📋 Code Quality
on:
  push:
    paths:
      - '.github/workflows/code-quality.yml'
      - 'src/**/*.rs'
      - 'Cargo.toml'
      - 'tests/**/*'
      - 'codecov.yml'
      - 'ort-sys/build/**/*.rs'
      - 'ort-sys/src/**/*.rs'
      - 'ort-sys/Cargo.toml'
  pull_request:
    types: [ opened, synchronize, reopened ]
    paths:
      - '.github/workflows/code-quality.yml'
      - 'src/**/*.rs'
      - 'Cargo.toml'
      - 'tests/**/*'
      - 'codecov.yml'
      - 'ort-sys/build/**/*.rs'
      - 'ort-sys/src/**/*.rs'
      - 'ort-sys/Cargo.toml'
permissions:
  contents: read
concurrency:
  group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
  cancel-in-progress: true
env:
  RUST_BACKTRACE: 1
jobs:
  lint-and-fmt:
    name: Lint & format
    runs-on: ubuntu-24.04
    if: github.event.pull_request.draft == false
    steps:
      - name: Checkout sources
        uses: actions/checkout@v5
      - name: Install Rust
        uses: dtolnay/rust-toolchain@nightly
        with:
          toolchain: nightly-2026-01-29
          components: rustfmt, clippy
      - name: Check fmt
        run: cargo fmt --all -- --check
      - name: Run clippy
        run: cargo clippy -p ort --all-targets --features fetch-models
  coverage:
    name: Code coverage
    runs-on: ubuntu-24.04
    if: github.event.pull_request.draft == false
    steps:
      - name: Checkout sources
        uses: actions/checkout@v5
      - name: Install Rust
        uses: dtolnay/rust-toolchain@nightly
        with:
          toolchain: nightly-2026-01-29
      - name: Get Rust version
        id: rust-version
        run: echo "::set-output name=version::$(cargo --version | cut -d ' ' -f 2)"
        shell: bash
      - uses: actions/cache@v4
        id: tarpaulin-cache
        with:
          path: ~/.cargo/bin/cargo-tarpaulin
          key: ${{ runner.os }}-cargo-${{ steps.rust-version.outputs.version }}-0.35.2
      - name: Install tarpaulin
        if: steps.tarpaulin-cache.outputs.cache-hit != 'true'
        run: cargo install cargo-tarpaulin --version 0.35.2
      - name: Generate code coverage
        run: |
          cargo tarpaulin -p ort --features fetch-models,tls-rustls --verbose --timeout 120 --out xml --engine llvm --doc --lib --tests -- --test-threads 1
      - name: Upload to codecov.io
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          fail_ci_if_error: false
  docs-rs:
    name: docs.rs build
    runs-on: ubuntu-24.04
    steps:
      - name: Checkout sources
        uses: actions/checkout@v5
      - name: Install Rust
        uses: dtolnay/rust-toolchain@nightly
        with:
          toolchain: nightly-2026-01-29
          targets: wasm32-unknown-unknown
      - name: Install cargo-docs-rs
        uses: dtolnay/install@cargo-docs-rs
      - run: cargo docs-rs
