name: Formatter and linter

on:
  push:
    branches: [ master, dev ]
  pull_request:
    branches: [ '**' ]

permissions:
  contents: read

env:
  CARGO_TERM_COLOR: always

jobs:
  lint:

    runs-on: ubuntu-latest

    steps:
    - name: Install minimal nightly (only for fmt)
      uses: dtolnay/rust-toolchain@0f1b44df7e9cbb178d781a242338dfa5e243ad7f # nightly
      with:
        components: rustfmt
    - name: Install minimal stable
      uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable
      with:
        components: rustfmt, clippy
    - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
    - name: Install Protoc
      uses: ./.github/actions/setup-protoc
    - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
      with:
        # Only save the cache on dev; feature-branch caches would just get evicted under the 10 GB budget
        save-if: ${{ github.ref == 'refs/heads/dev' }}
    - name: Update apt
      run: sudo apt-get update
    - name: Install dependencies
      run: sudo apt-get install clang libunwind-dev
    - name: Check code formatting
      run: cargo +nightly fmt --all -- --check
    - name: Check cargo clippy warnings
      run: cargo clippy --workspace -- -D warnings
    - name: Check cargo clippy warnings for all targets
      run: cargo clippy --workspace --all-targets -- -D warnings
    - name: Check cargo clippy warnings for all targets and features
      run: cargo clippy --workspace --all-targets --all-features -- -D warnings
