name: CI

on:
  pull_request: {}
  push:
    branches:
      - main
  schedule:
    - cron: '48 17 * * 6'

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  msrv:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@1.81
    - uses: Swatinem/rust-cache@v2
    - run: cargo build --workspace --lib

  test_lib:
    runs-on: ubuntu-latest
    needs: basics
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
    - uses: Swatinem/rust-cache@v2
    - run: cargo test --all-targets --all-features

  test_doc:
    runs-on: ubuntu-latest
    needs: basics
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
    - uses: Swatinem/rust-cache@v2
    - run: cargo test --doc --all-features
  
  rustfmt:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
      with:
        components: rustfmt
    - run: cargo fmt --all -- --check

  clippy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
      with:
        components: clippy
    - uses: Swatinem/rust-cache@v2
    - run: cargo clippy --all-features --all-targets -- -D warnings

  docs:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@nightly
    - uses: Swatinem/rust-cache@v2
    - run: cargo doc -p rune --all-features
      env:
        RUSTFLAGS: --cfg rune_docsrs
        RUSTDOCFLAGS: --cfg rune_docsrs

  nightly:
    runs-on: ubuntu-latest
    env:
      RUSTFLAGS: -D warnings --cfg rune_nightly
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@nightly
    - uses: Swatinem/rust-cache@v2
    - run: cargo build --all-features
    - run: cargo build --tests --all-features

  basics:
    runs-on: ubuntu-latest
    needs:
    - rustfmt
    - clippy
    - docs
    - msrv
    - nightly
    steps:
    - run: exit 0

  build_feature:
    runs-on: ubuntu-latest
    needs: basics
    strategy:
      fail-fast: false
      matrix:
        feature:
        - alloc
        - cli
        - cli,doc
        - cli,fmt
        - doc
        - workspace
        - languageserver
        - byte-code
        - capture-io
        - emit
    env:
      RUSTFLAGS: -D warnings
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
      with:
        components: clippy
    - uses: Swatinem/rust-cache@v2
    - run: cargo check -p rune --no-default-features --features ${{matrix.feature}}
    - run: cargo check --release -p rune --no-default-features --features ${{matrix.feature}}
    - run: cargo clippy --all-targets --no-default-features --features ${{matrix.feature}}

  wasm:
    runs-on: ubuntu-latest
    needs: basics
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
      with:
        targets: wasm32-unknown-unknown
    - uses: Swatinem/rust-cache@v2
    - run: cargo build -p rune-wasm --target wasm32-unknown-unknown

  no_std:
    runs-on: ${{matrix.os}}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
        example: [minimal]
    needs: basics
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@nightly
    - uses: Swatinem/rust-cache@v2
    - run: cargo run --manifest-path=no-std/Cargo.toml --example ${{matrix.example}}

  test_miri:
    runs-on: ubuntu-latest
    needs: basics
    strategy:
      fail-fast: false
      matrix:
        crate:
        - rune
        - rune-core
        - rune-alloc
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@nightly
      with:
        components: miri
    - uses: Swatinem/rust-cache@v2
    - run: cargo miri test -p ${{matrix.crate}} --all-features --all-targets
    - run: cargo miri test -p ${{matrix.crate}} --all-features --doc

  test_rune:
    runs-on: ubuntu-latest
    needs: basics
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
    - uses: Swatinem/rust-cache@v2
    - run: cargo build --release --bin rune
    - run: cargo run --release --bin rune -- fmt --verbose --check
    - run: cargo run --release --bin rune -- fmt --verbose --check --recursive scripts
    - run: cargo run --release --bin rune -- check --recursive scripts
    - run: cargo run --release --bin rune -- check --all-targets
    - run: cargo run --release --bin rune -- test --all-targets -O test-std=true
