name: CI

on:
  push:
    tags: ["v*"]
  pull_request:
    paths-ignore:
      - 'docs/**'
      - '*.md'
      - '.github/**'
      - 'README.md'
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }}
  cancel-in-progress: true

permissions:
  contents: write
  packages: write

jobs:
  style:
    name: Style
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          override: true
      - name: Style check
        run: cargo fmt --all -- --check
      - name: Clippy check
        run: cargo clippy --all-targets --all-features

  docs:
    name: Docs
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          override: true
      - name: Build docs
        run: cargo doc --document-private-items --all-features

  tests:
    name: Tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          override: true
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@v2
        with:
          tool: cargo-nextest
      - name: Tests --all-features
        shell: bash
        run: cargo nextest run --workspace --all-features
      - name: Test --no-default-features
        run: cargo nextest run --workspace --no-default-features
      - name: Test webpki-roots feature
        run: cargo nextest run --workspace --no-default-features --features webpki-roots
      - name: Test native-roots feature
        run: cargo nextest run --workspace --no-default-features --features native-roots
      - name: Test webpki-roots and native-roots features
        run: cargo nextest run --workspace --no-default-features --features webpki-roots,native-roots
      - name: Test cookies feature
        run: cargo nextest run --workspace --features cookies
      - name: Test cookies-abstract feature
        run: cargo nextest run --workspace --features cookies-abstract
      - name: Test cookies cookies cookies-preserve-order feature
        run: cargo nextest run --workspace --features cookies,cookies-preserve-order
      - name: Test --features gzip,stream
        run: cargo nextest run --workspace --features gzip,stream
      - name: Test --features brotli,stream
        run: cargo nextest run --workspace --features brotli,stream
      - name: Test --features zstd,stream
        run: cargo nextest run --workspace --features zstd,stream
      - name: Test --features deflate,stream
        run: cargo nextest run --workspace --features deflate,stream
      - name: Test --features json
        run: cargo nextest run --workspace --features json
      - name: Test --features multipart
        run: cargo nextest run --workspace --features multipart
      - name: Test --features stream
        run: cargo nextest run --workspace --features stream
      - name: Test --features hickory-dns
        run: cargo nextest run --workspace --features hickory-dns

  windows:
    name: Windows
    runs-on: windows-latest
    environment: Windows
    steps:
      - uses: actions/checkout@v4
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          override: true
      - name: Install NASM
        run: |
          choco install nasm -y
      - name: Build
        run: |
          cargo build --all-features

  macos:
    name: macOS
    runs-on: macos-latest
    environment: macOS
    steps:
      - uses: actions/checkout@v4
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          override: true
      - name: Build
        run: |
          cargo build --all-features

  linux:
    name: Linux
    needs: [style, tests, docs, windows, macos]
    runs-on: ubuntu-latest
    environment: Linux
    if: startsWith(github.ref, 'refs/tags/')
    steps:
      - uses: actions/checkout@v4
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          override: true
      - name: Check semver
        uses: obi1kenobi/cargo-semver-checks-action@v2
      - uses: katyo/publish-crates@v2
        with:
          registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }}
          ignore-unpublished-changes: true
      - name: Upload binaries to GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          prerelease: ${{ contains(github.ref, 'alpha') || contains(github.ref, 'beta') || contains(github.ref, 'rc') }}
          generate_release_notes: true
