name: Rust

on:
  workflow_dispatch:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]

env:
  CARGO_TERM_COLOR: always

jobs:
  cargo-fmt-check:
    runs-on: blacksmith-4vcpu-ubuntu-2404
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v3
      - uses: dtolnay/rust-toolchain@stable
      - name: Check formatting
        run: cargo fmt --check
      - name: Check formatting (fuzz)
        run: cd fuzz && cargo fmt --check

  build-native:
    timeout-minutes: 30
    strategy:
      matrix:
        os: [blacksmith-4vcpu-ubuntu-2404, macos-latest, windows-latest]

    runs-on: ${{ matrix.os }}

    steps:
      - uses: actions/checkout@v3
      - uses: useblacksmith/rust-cache@v3
        with:
          prefix-key: "v1-rust" # can be updated if we need to reset caches due to non-trivial change in the dependencies (for example, custom env var were set for single workspace project)
      - name: Set up Python 3.10
        uses: useblacksmith/setup-python@v6
        with:
          python-version: "3.10"
      - name: Build
        run: cargo build --verbose
      - name: Test Checksums
        run: |
          cargo test --features checksum --color=always --lib storage::checksum
          cargo test --features checksum --color=always --test integration_tests storage::checksum
      - name: Test
        env:
          RUST_LOG: ${{ runner.debug && 'turso_core::storage=trace' || '' }}
        run: cargo test --verbose --features checksum --test integration_tests
        timeout-minutes: 20

  clippy:
    runs-on: blacksmith-4vcpu-ubuntu-2404
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v3
      - name: Clippy
        run: |
          cargo clippy --workspace --all-features --all-targets -- --deny=warnings

  simulator:
    runs-on: blacksmith-4vcpu-ubuntu-2404
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v3
      - uses: useblacksmith/rust-cache@v3
        with:
          prefix-key: "v1-rust" # can be updated if we need to reset caches due to non-trivial change in the dependencies (for example, custom env var were set for single workspace project)
      - name: Simulator default
        run: ./scripts/run-sim --maximum-tests 1000 --min-tick 10 --max-tick 50 loop -n 10 -s
      - name: Simulator InsertHeavy
        run: ./scripts/run-sim --maximum-tests 1000 --min-tick 10 --max-tick 50 --profile write_heavy loop -n 10 -s
      - name: Simulator Faultless
        run: ./scripts/run-sim --maximum-tests 1000 --min-tick 10 --max-tick 50 --profile faultless loop -n 10 -s
      - name: Simulator Differential
        run: ./scripts/run-sim --maximum-tests 1000 --differential loop -n 10 -s

  test-limbo:
    runs-on: blacksmith-4vcpu-ubuntu-2404
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v3

      - name: Install uv
        uses: useblacksmith/setup-uv@v4
        with:
          enable-cache: true

      - name: Set up Python
        run: uv python install

      - uses: "./.github/shared/install_sqlite"
      - name: Test
        run: make test
        timeout-minutes: 20
  test-sqlite:
    runs-on: blacksmith-4vcpu-ubuntu-2404
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v3
      - uses: "./.github/shared/install_sqlite"
      - name: build SQLite test extensions
        run: cargo build --package limbo_sqlite_test_ext
      - name: Test
        run: SQLITE_EXEC="sqlite3" make test-compat
