name: exhaustive

env:
  RUST_BACKTRACE: 1

jobs:
  test:
    name: cargo test
    strategy:
      matrix:
        platform:
        - { toolchain: stable, target: i686-pc-windows-msvc, os: windows-latest }
        - { toolchain: stable, target: i686-unknown-linux-gnu, os: ubuntu-latest }
        - { toolchain: stable, target: x86_64-apple-darwin, os: macos-latest }
        - { toolchain: stable, target: x86_64-pc-windows-msvc, os: windows-latest }
        - { toolchain: stable, target: x86_64-unknown-linux-gnu, os: ubuntu-latest }
    runs-on: ${{ matrix.platform.os }}
    steps:
    - uses: actions/checkout@v4
    - uses: actions-rust-lang/setup-rust-toolchain@v1
      with:
        toolchain: ${{ matrix.platform.toolchain }}
        target: ${{ matrix.platform.target }}
    - uses: taiki-e/install-action@v2
      with: { tool: cargo-nextest }
    - run: cargo --locked nextest run --workspace --all-features
    - run: cargo --locked test --workspace --doc --all-features

  min-versions-shallow:
    name: cargo test --shallow-minimal-versions
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: actions-rust-lang/setup-rust-toolchain@v1
      with: { toolchain: nightly }
    - name: Update to shallow minimal versions
      run:
        cargo update $(
          cargo metadata --all-features --format-version 1
            | jq -r '
              . as $root
              | .resolve.nodes[]
              | select(.id == $root.resolve.root)
              | .deps[].pkg
              | . as $dep
              | $root.packages[]
              | select(.id == $dep)
              | "-p", "\(.name):\(.version)"
            '
        ) -Z minimal-versions
    - uses: actions-rust-lang/setup-rust-toolchain@v1
      with: { toolchain: stable }
    - uses: taiki-e/install-action@v2
      with: { tool: cargo-nextest }
    - run: cargo --locked nextest run --workspace --all-features
    - run: cargo --locked test --workspace --doc --all-features

  min-versions:
    name: cargo test minimal-versions
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: actions-rust-lang/setup-rust-toolchain@v1
      with: { toolchain: nightly }
    - name: Update to minimal versions
      run:
        cargo update -Z minimal-versions
    - uses: actions-rust-lang/setup-rust-toolchain@v1
      with: { toolchain: stable }
    - uses: taiki-e/install-action@v2
      with: { tool: cargo-nextest }
    - run: cargo --locked nextest run --workspace --all-features
    - run: cargo --locked test --workspace --doc --all-features

  check-features:
    name: cargo hack check --feature-powerset
    runs-on: ubuntu-latest
    env:
      RUSTFLAGS: -Dwarnings
    steps:
    - uses: actions/checkout@v4
    - uses: actions-rust-lang/setup-rust-toolchain@v1
    - uses: taiki-e/install-action@v2
      with: { tool: cargo-hack }
    - run:
        cargo hack check
          --workspace
          --feature-powerset
          --no-dev-deps
          --skip 'all,all-algorithms,all-implementations'

  check-test-features:
    name: cargo hack check --all-targets --feature-powerset
    runs-on: ubuntu-latest
    env:
      RUSTFLAGS: -Dwarnings
    steps:
    - uses: actions/checkout@v4
    - uses: actions-rust-lang/setup-rust-toolchain@v1
    - uses: taiki-e/install-action@v2
      with: { tool: cargo-hack }
    - run:
        cargo hack check
          --workspace
          --feature-powerset
          --all-targets
          --skip 'all,all-algorithms,all-implementations'

on:
  merge_group:
    types: [checks_requested]
  pull_request:
    branches: [main]
    types: [opened, synchronize, reopened, ready_for_review]
