name: CI

on:
  push:
    branches:
    - master

  pull_request:
    branches:
    - master

jobs:
  build:
    name: Build and Test
    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [ubuntu-22.04, windows-latest, macos-latest, windows-11-arm, ubuntu-22.04-arm]

    steps:
    - uses: actions/checkout@v4
      with:
        submodules: true

    - name: Install Rust
      uses: dtolnay/rust-toolchain@stable

    - name: Restore Rust Cache
      uses: actions/cache/restore@v4
      with:
        path: |
          ~/.cargo/registry
          ~/.cargo/git
          target
        key: ${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

    - name: Build
      run: cargo build --locked --verbose

    - name: Test
      run: cargo test --locked --verbose

    - name: Save Rust Cache
      uses: actions/cache/save@v4
      with:
        path: |
          ~/.cargo/registry
          ~/.cargo/git
          target
        key: ${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

  msrv:
    name: Check MSRV
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
      with:
        submodules: true

    - name: Install Rust
      uses: dtolnay/rust-toolchain@1.88.0

    - name: Restore Rust Cache
      uses: actions/cache/restore@v4
      with:
        path: |
          ~/.cargo/registry
          ~/.cargo/git
          target
        key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

    - name: Build
      run: cargo build --locked --verbose

    - name: Save Rust Cache
      uses: actions/cache/save@v4
      with:
        path: |
          ~/.cargo/registry
          ~/.cargo/git
          target
        key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

  lint:
    name: Rustfmt, Clippy, Stylua, & Selene
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
      with:
        submodules: true

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

    - name: Restore Rust Cache
      uses: actions/cache/restore@v4
      with:
        path: |
          ~/.cargo/registry
          ~/.cargo/git
          target
        key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

    - name: Setup Rokit
      uses: CompeyDev/setup-rokit@v0.1.2
      with:
        version: 'v1.1.0'

    - name: Stylua
      run: stylua --check plugin/src

    - name: Selene
      run: selene plugin/src

    - name: Rustfmt
      run: cargo fmt -- --check

    - name: Clippy
      run: cargo clippy

    - name: Save Rust Cache
      uses: actions/cache/save@v4
      with:
        path: |
          ~/.cargo/registry
          ~/.cargo/git
          target
        key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
