name: Lint

on:
  pull_request:
    types: [opened, synchronize, reopened]

permissions:
  contents: read # to fetch code (actions/checkout)

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  fmt:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: nightly
          components: rustfmt

      - run: cargo fmt --all -- --check

  clippy:
    permissions:
      checks: write # to add clippy checks to PR diffs

    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with: { components: clippy }

      - uses: giraffate/clippy-action@v1
        with:
          reporter: 'github-pr-check'
          github_token: ${{ secrets.GITHUB_TOKEN }}
          clippy_flags: --workspace --all-features --tests --examples --bins -- -Dclippy::todo

  lint-docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with: { components: rust-docs }

      - name: Check for broken intra-doc links
        env: { RUSTDOCFLAGS: "-D warnings" }
        run: cargo doc --no-deps --all-features --workspace

  public-api-diff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ github.base_ref }}

      - uses: actions/checkout@v3

      - uses: actions-rust-lang/setup-rust-toolchain@v1
        # temp: unpin once https://github.com/rust-lang/rust/issues/113152 is fixed
        with: { toolchain: nightly-2023-06-28 }

      - uses: taiki-e/cache-cargo-install-action@v1
        with: { tool: cargo-public-api }

      - name: generate API diff
        run: |
          for f in $(find -mindepth 2 -maxdepth 2 -name Cargo.toml); do
            cargo public-api --manifest-path "$f" diff ${{ github.event.pull_request.base.sha }}..${{ github.sha }}
          done