name: CI

on:
  push:
  pull_request:
  workflow_dispatch:

defaults:
  run:
    shell: bash

jobs:

  fmt:
    name: Check formatting
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

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

      - name: Install Just
        uses: extractions/setup-just@v2

      - name: Install Tooling
        uses: ok-nick/setup-aftman@v0.4.2

      - name: Check Formatting
        run: just fmt-check

  analyze:
    needs: ["fmt"]
    name: Analyze and lint Luau files
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install Just
        uses: extractions/setup-just@v2

      - name: Install Tooling
        uses: ok-nick/setup-aftman@v0.4.2

      - name: Analyze
        run: just analyze

  ci:
    needs: ["fmt"]
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: Windows x86_64
            runner-os: windows-latest
            cargo-target: x86_64-pc-windows-msvc

          - name: Linux x86_64
            runner-os: ubuntu-latest
            cargo-target: x86_64-unknown-linux-gnu

          - name: macOS x86_64
            runner-os: macos-13
            cargo-target: x86_64-apple-darwin

          - name: macOS aarch64
            runner-os: macos-14
            cargo-target: aarch64-apple-darwin

    name: CI - ${{ matrix.name }}
    runs-on: ${{ matrix.runner-os }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          submodules: true

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
          targets: ${{ matrix.cargo-target }}

      - name: Build
        run: |
          cargo build \
          --workspace \
          --locked --all-features \
          --target ${{ matrix.cargo-target }}

      - name: Lint
        run: |
          cargo clippy \
          --workspace \
          --locked --all-features \
          --target ${{ matrix.cargo-target }}

      - name: Test
        run: |
          cargo test \
          --lib --workspace \
          --locked --all-features \
          --target ${{ matrix.cargo-target }}