# Copyright 2019-2023 Tauri Programme within The Commons Conservancy
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MIT

name: Lint Rust

on:
  push:
    branches:
      - v1
      - v2
    paths:
      - '.github/workflows/lint-rust.yml'
      - 'plugins/*/src/**'
      - '!plugins/*/src/api-iife.js'
      - '**/Cargo.toml'
  pull_request:
    branches:
      - v1
      - v2
    paths:
      - '.github/workflows/lint-rust.yml'
      - 'plugins/*/src/**'
      - '!plugins/*/src/api-iife.js'
      - '**/Cargo.toml'

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

jobs:
  changes:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: read
    outputs:
      packages: ${{ steps.filter.outputs.changes }}
    steps:
      - uses: actions/checkout@v4
      - uses: dorny/paths-filter@v2
        id: filter
        with:
          filters: |
            tauri-plugin-autostart:
              - .github/workflows/lint-rust.yml
              - plugins/autostart/**
            tauri-plugin-cli:
              - .github/workflows/lint-rust.yml
              - plugins/cli/**
            tauri-plugin-clipboard-manager:
              - .github/workflows/lint-rust.yml
              - plugins/clipboard-manager/**
            tauri-plugin-deep-link:
              - .github/workflows/lint-rust.yml
              - plugins/deep-link/**
            tauri-plugin-dialog:
              - .github/workflows/lint-rust.yml
              - plugins/dialog/**
              - plugins/fs/**
            tauri-plugin-fs:
              - .github/workflows/lint-rust.yml
              - plugins/fs/**
            tauri-plugin-geolocation:
              - .github/workflows/lint-rust.yml
              - plugins/geolocation/**
            tauri-plugin-global-shortcut:
              - .github/workflows/lint-rust.yml
              - plugins/global-shortcut/**
            tauri-plugin-opener:
              - .github/workflows/lint-rust.yml
              - plugins/opener/**
            tauri-plugin-haptics:
              - .github/workflows/lint-rust.yml
              - plugins/haptics/**
            tauri-plugin-http:
              - .github/workflows/lint-rust.yml
              - plugins/http/**
              - plugins/fs/**
            tauri-plugin-localhost:
              - .github/workflows/lint-rust.yml
              - plugins/localhost/**
            tauri-plugin-log:
              - .github/workflows/lint-rust.yml
              - plugins/log/**
            tauri-plugin-notification:
              - .github/workflows/lint-rust.yml
              - plugins/notification/**
            tauri-plugin-os:
              - .github/workflows/lint-rust.yml
              - plugins/os/**
            tauri-plugin-persisted-scope:
              - .github/workflows/lint-rust.yml
              - plugins/persisted-scope/**
              - plugins/fs/**
            tauri-plugin-positioner:
              - .github/workflows/lint-rust.yml
              - plugins/positioner/**
            tauri-plugin-process:
              - .github/workflows/lint-rust.yml
              - plugins/process/**
            tauri-plugin-shell:
              - .github/workflows/lint-rust.yml
              - plugins/shell/**
            tauri-plugin-single-instance:
              - .github/workflows/lint-rust.yml
              - plugins/single-instance/**
            tauri-plugin-sql:
              - .github/workflows/lint-rust.yml
              - plugins/sql/**
            tauri-plugin-store:
              - .github/workflows/lint-rust.yml
              - plugins/store/**
            tauri-plugin-stronghold:
              - .github/workflows/lint-rust.yml
              - plugins/stronghold/**
            tauri-plugin-updater:
              - .github/workflows/lint-rust.yml
              - plugins/updater/**
            tauri-plugin-upload:
              - .github/workflows/lint-rust.yml
              - plugins/upload/**
            tauri-plugin-websocket:
              - .github/workflows/lint-rust.yml
              - plugins/websocket/**
            tauri-plugin-window-state:
              - .github/workflows/lint-rust.yml
              - plugins/window-state/**

  clippy:
    needs: changes
    if: ${{ needs.changes.outputs.packages != '[]' && needs.changes.outputs.packages != '' }}
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        package: ${{ fromJSON(needs.changes.outputs.packages) }}

    steps:
      - uses: actions/checkout@v4

      - name: install webkit2gtk
        run: |
          sudo apt-get update
          sudo apt-get install -y libwebkit2gtk-4.0-dev libwebkit2gtk-4.1-dev

      - name: Install clippy with stable toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy

      - uses: Swatinem/rust-cache@v2

      - name: clippy ${{ matrix.package }}
        run: cargo clippy --package ${{ matrix.package }} --all-targets -- -D warnings

      - name: clippy ${{ matrix.package }} --all-features
        if: matrix.package != 'tauri-plugin-dialog'
        run: cargo clippy --package ${{ matrix.package }} --all-targets --all-features -- -D warnings
