name: Lint

on: [pull_request]

permissions:
  contents: read

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

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

      - name: Install Rust (nightly)
        uses: actions-rust-lang/setup-rust-toolchain@v1.9.0
        with:
          toolchain: nightly
          components: rustfmt

      - name: Check with rustfmt
        run: cargo fmt --all -- --check

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

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

      - name: Install Rust
        uses: actions-rust-lang/setup-rust-toolchain@v1.9.0
        with:
          components: clippy

      - name: Check with Clippy
        uses: giraffate/clippy-action@v1.0.1
        with:
          reporter: github-pr-check
          github_token: ${{ secrets.GITHUB_TOKEN }}
          clippy_flags: >-
            --workspace --all-features --tests --examples --bins --
            -A unknown_lints -D clippy::todo -D clippy::dbg_macro

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

      - name: checkout ${{ github.head_ref }}
        uses: actions/checkout@v4

      - name: Install Rust (nightly)
        uses: actions-rust-lang/setup-rust-toolchain@v1.9.0
        with:
          toolchain: nightly

      - name: Install cargo-public-api
        uses: taiki-e/cache-cargo-install-action@v2.0.1
        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" --all-features diff ${{ github.event.pull_request.base.sha }}..${{ github.sha }} >> /tmp/diff.txt
          done
          cat /tmp/diff.txt