# Inspired by https://github.com/joshka/github-workflows/blob/main/.github/workflows/rust-check.yml
name: Lint & Test

on:
  pull_request:
    branches:
      - "**"
  merge_group:
  workflow_call:

env:
  CARGO_TERM_COLOR: always
  RUST_VERSION: 1.91.0

# ensure that the workflow is only triggered once per PR, subsequent pushes to the PR will cancel
# and restart the workflow. See https://docs.github.com/en/actions/using-jobs/using-concurrency
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  fmt:
    name: stable / fmt
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust stable
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          components: rustfmt
          toolchain: ${{ env.RUST_VERSION }}

      - name: Run cargo fmt
        run: cargo fmt -- --check

  # Special check to make sure rig-core is compatible with the wasm target
  check-wasm:
    name: stable / check rig-core wasm target
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust stable
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          target: wasm32-unknown-unknown
          toolchain: ${{ env.RUST_VERSION }}

      - name: Run cargo check wasm target
        run: cargo check --package rig-core --features wasm --target wasm32-unknown-unknown

  clippy:
    name: stable / clippy
    runs-on: ubuntu-latest
    permissions:
      checks: write
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust stable
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          components: clippy
          toolchain: ${{ env.RUST_VERSION }}

      # Required to compile rig-lancedb
      - name: Install Protoc
        run: sudo apt-get update && sudo apt-get install -y protobuf-compiler

      - name: Run clippy action
        uses: clechasseur/rs-clippy-check@v3
        with:
          args: --all-features --all-targets

  test:
    name: stable / test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust stable
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: ${{ env.RUST_VERSION }}

      - name: Install nextest
        uses: taiki-e/install-action@v2
        with:
          tool: nextest

      # Required to compile rig-lancedb
      - name: Install Protoc
        run: sudo apt-get update && sudo apt-get install -y protobuf-compiler

      - name: Test with latest nextest release
        uses: actions-rs/cargo@v1
        with:
          command: nextest
          args: run --all-features --retries 2
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
          COHERE_API_KEY: ${{ secrets.COHERE_API_KEY }}
          PERPLEXITY_API_KEY: ${{ secrets.PERPLEXITY_API_KEY }}

  doc:
    name: stable / doc
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust stable
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          components: rust-docs
          toolchain: ${{ env.RUST_VERSION }}

      # Required to compile rig-lancedb
      - name: Install Protoc
        run: sudo apt-get update && sudo apt-get install -y protobuf-compiler

      - name: Run cargo doc
        run: cargo doc --no-deps --all-features
        env:
          RUSTDOCFLAGS: -D warnings
