rustscript-embedded 0.3.3

Embedded RustScript VMBC runtime with a no_std host-function ABI
name: CI

on:
  push:
  pull_request:

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

jobs:
  host:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          path: app
      - uses: dtolnay/rust-toolchain@1.94.1
        with:
          components: clippy, rustfmt
      - name: Format
        run: cargo fmt --all -- --check
        working-directory: app
      - name: Clippy
        run: cargo clippy --all-targets -- -D warnings
        working-directory: app
      - name: Test host runner
        run: cargo test --all-targets
        working-directory: app
      - name: Test embedded host-function ABI
        run: cargo test --features esp32c3,wifi,bluetooth
        working-directory: app
      - name: Test VMBC partition packer
        run: |
          python scripts/flash_vmbc.py programs/esp32-blinky.rss --output /tmp/rustscript.partition.bin
          test -s /tmp/rustscript.partition.bin
        working-directory: app
      - name: Examples smoke
        run: |
          cargo run --example run_file -- programs/blinky.rss | grep 'led:off'
          printf 'print(1 + 2);\n.quit\n' | cargo run --example repl | grep '3'
        working-directory: app

  esp32:
    name: ESP32-C3 factory firmware
    runs-on: ubuntu-latest
    env:
      PLATFORMIO_CORE_DIR: /mnt/TEMP/platformio/core
      PIP_CACHE_DIR: /mnt/TEMP/platformio/pip-cache
    steps:
      - uses: actions/checkout@v4
        with:
          path: app
      - uses: dtolnay/rust-toolchain@1.94.1
        with:
          components: llvm-tools-preview
          targets: riscv32imc-unknown-none-elf,riscv32imafc-unknown-none-elf
      - uses: actions/setup-python@v5
        with:
          python-version: "3.11"
      - name: Install PlatformIO
        run: |
          sudo mkdir -p /mnt/TEMP
          sudo chown -R "$USER:$USER" /mnt/TEMP
          python -m venv /mnt/TEMP/platformio/venv
          /mnt/TEMP/platformio/venv/bin/pip install platformio==6.1.19
          echo /mnt/TEMP/platformio/venv/bin >> "$GITHUB_PATH"
      - name: Build complete firmware
        run: pio run
        working-directory: app
      - name: Build and run Arduino target
        run: |
          pio run -e arduino
          .pio/build/arduino/program | tee /tmp/arduino.log
          grep 'micro-rustscript:gpio=low' /tmp/arduino.log
          grep 'rss:status=0' /tmp/arduino.log
        working-directory: app
      - name: Install ESP-IDF preview toolchain under /mnt/TEMP
        run: |
          sudo mkdir -p /mnt/TEMP
          sudo chown -R "$USER:$USER" /mnt/TEMP
          ci/install-esp-idf-s31.sh
        working-directory: app
      - name: Build ESP32-S31 factory image
        run: pio run -e esp32s31
        working-directory: app
      - name: Verify firmware artifacts
        run: |
          test -s .pio/build/esp32-c3-devkitm-1/firmware.elf
          test -s .pio/build/esp32-c3-devkitm-1/firmware.bin
          test -s dist/micro-rustscript-esp32-c3.factory.bin
          test -s .pio/generated/rustscript.partition.bin
          test -s .pio/build/arduino/program
          test -s dist/micro-rustscript-esp32-s31.factory.bin
          test -s /mnt/TEMP/micro-rustscript-esp32s31/build/micro_rustscript_esp32s31.elf
          cp /mnt/TEMP/micro-rustscript-esp32s31/build/micro_rustscript_esp32s31.elf \
            dist/micro-rustscript-esp32-s31.elf
          nm -C .pio/build/esp32-c3-devkitm-1/firmware.elf | grep rustscript_run_vmbc
          nm -C .pio/build/esp32-c3-devkitm-1/firmware.elf | grep rustscript_dispatch_host
          grep 'rustscript.*0x110000.*0x010000' partitions.csv
          stat --format='%n %s bytes' \
            .pio/build/esp32-c3-devkitm-1/firmware.elf \
            .pio/build/esp32-c3-devkitm-1/firmware.bin \
            dist/micro-rustscript-esp32-c3.factory.bin \
            .pio/generated/esp32-blinky.vmbc \
            .pio/generated/rustscript.partition.bin
          test "$(stat --format=%s dist/micro-rustscript-esp32-c3.factory.bin)" -lt 1200000
        working-directory: app
      - uses: actions/upload-artifact@v4
        with:
          name: micro-rustscript-firmware
          path: |
            app/dist/micro-rustscript-esp32-c3.factory.bin
            app/.pio/build/esp32-c3-devkitm-1/firmware.elf
            app/.pio/generated/esp32-blinky.vmbc
            app/.pio/generated/rustscript.partition.bin
            app/.pio/build/arduino/program
            app/dist/micro-rustscript-esp32-s31.factory.bin
            app/dist/micro-rustscript-esp32-s31.elf
            app/scripts/flash_vmbc.py
            app/scripts/vmbc_image.py
            app/scripts/repl_vmbc.py
            app/partitions.csv