name: (Compiler) Rust

on:
  push:
    branches: ["main"]
    paths:
      - .github/workflows/**
      - compiler/crates/**
      - compiler/Cargo.*
      - compiler/*.toml
  pull_request:
    paths:
      - .github/workflows/**
      - compiler/crates/**
      - compiler/Cargo.*
      - compiler/*.toml

env:
  CARGO_TERM_COLOR: always
  RUSTFLAGS: -Dwarnings
  TZ: /usr/share/zoneinfo/America/Los_Angeles

defaults:
  run:
    working-directory: compiler

jobs:
  test:
    name: Rust Test (${{ matrix.target.os }})
    strategy:
      matrix:
        target:
          - target: ubuntu-latest
            os: ubuntu-latest
          # TODO: run on more platforms
          # - target: macos-latest
          #   os: macos-latest
          # - target: windows-latest
          #   os: windows-latest
    runs-on: ${{ matrix.target.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
      - name: cargo test
        run: cargo test --manifest-path=Cargo.toml --locked ${{ matrix.target.features && '--features' }} ${{ matrix.target.features }}

  lint:
    name: Rust Lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions-rs/toolchain@v1
        with:
          # NOTE: use `rustup run <toolchain> <command>` in commands below
          # with this exact same toolchain value
          toolchain: nightly-2023-08-01
          override: true
          components: rustfmt, clippy
      - uses: Swatinem/rust-cache@v2
      - name: rustfmt
        run: grep -r --include "*.rs" --files-without-match "@generated" crates | xargs rustup run nightly-2023-08-01 rustfmt --check --config="skip_children=true"
      # - name: cargo clippy
      #   run: rustup run nightly-2023-08-01 cargo clippy -- -Dclippy::correctness

  build:
    name: Rust Build
    runs-on: ubuntu-latest
    # TODO: build on more platforms, deploy, etc
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
      - name: cargo build
        run: cargo build --release