on:
  push:
    branches: [main]
  pull_request:
name: CI # Continuous Integration

jobs:

  test:
    name: Run test suite
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - uses: actions-rs/cargo@v1
        with:
          command: test
          args: --workspace --all-targets --all-features

  test-features-reqwest-middleware:
    name: Run test suite for `reqwest-middleware` with every feature combination
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Install cargo-hack
        uses: taiki-e/install-action@cargo-hack
      - name: test
        run: cargo hack test --feature-powerset -p reqwest-middleware
  test-features-retry:
    name: Run test suite for `reqwest-retry` with every feature combination
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Install cargo-hack
        uses: taiki-e/install-action@cargo-hack
      - name: test
        run: cargo hack test --feature-powerset -p reqwest-retry
  test-features-reqwest-tracing:
    name: Run test suite for `reqwest-tracing` with every feature combination
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Install cargo-hack
        uses: taiki-e/install-action@cargo-hack
      # Old opentelemetry features group to improve performance
      - name: test
        run: cargo hack test --feature-powerset -p reqwest-tracing --group-features opentelemetry_0_20,opentelemetry_0_21,opentelemetry_0_22
  
  rustfmt:
    name: Rustfmt
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Check formatting
        uses: actions-rs/cargo@v1
        with:
          command: fmt
          args: --all -- --check

  clippy:
    name: Run clippy
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Clippy check
        uses: actions-rs/cargo@v1
        with:
          command: clippy
          args: --all-targets --all-features --workspace -- -D warnings


  clippy-features:
    name: Run clippy for every feature combination
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Install cargo-hack
        uses: taiki-e/install-action@cargo-hack
      - name: test
        run: cargo hack clippy --feature-powerset

  typos:
    name: Spell Check with Typos
    runs-on: ubuntu-latest
    steps:
    - name: Checkout Actions Repository
      uses: actions/checkout@v4
    - name: Check spelling
      uses: crate-ci/typos@master

  docs:
    name: Docs
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Check documentation
        env:
          RUSTDOCFLAGS: -D warnings
        uses: actions-rs/cargo@v1
        with:
          command: doc
          args: --no-deps --document-private-items --all-features --workspace

  publish-check:
    name: Publish dry run
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - uses: actions-rs/cargo@v1
        with:
          command: publish
          args: --dry-run --manifest-path reqwest-middleware/Cargo.toml
      - uses: actions-rs/cargo@v1
        with:
          command: publish
          args: --dry-run --manifest-path reqwest-retry/Cargo.toml
      - uses: actions-rs/cargo@v1
        with:
          command: publish
          args: --dry-run --manifest-path reqwest-tracing/Cargo.toml