name: CI

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  check:
    timeout-minutes: 30

    strategy:
      fail-fast: false
      matrix:
        include:
          - name: Linux x86_64
            os: ubuntu-24.04
            target: x86_64-unknown-linux-gnu
            arguments: ""

          - name: Linux x86
            os: ubuntu-24.04
            target: i686-unknown-linux-gnu
            arguments: ""

          - name: Linux riscv64gc
            os: ubuntu-24.04
            target: riscv64gc-unknown-linux-gnu
            arguments: "--features=experimental_riscv"

          - name: MacOS aarch64
            os: macos-latest
            target: aarch64-apple-darwin
            arguments: ""

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

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4

      - name: Install toolchain
        run: |
          rustup toolchain install stable --no-self-update --profile=minimal --component clippy --target ${{ matrix.target }}
          rustup override set stable
          cargo -V

      - name: Caching
        uses: Swatinem/rust-cache@v2
        with:
          key: check-${{ matrix.target }}

      - name: Run clippy
        shell: bash
        run: |
          set -e

          # Check with no features
          cargo clippy --target ${{ matrix.target }} --no-default-features

          # Check with default features
          cargo clippy --target ${{ matrix.target }} ${{ matrix.arguments }}

  test:
    timeout-minutes: 30

    strategy:
      fail-fast: false
      matrix:
        include:
          - name: Linux x86_64
            os: ubuntu-24.04
            target: x86_64-unknown-linux-gnu

          - name: MacOS aarch64
            os: macos-latest
            target: aarch64-apple-darwin

    name: Test ${{ matrix.name }}
    runs-on: ${{ matrix.os }}
    needs: [ check ]

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4

      - name: Install toolchain
        run: |
          rustup toolchain install stable --no-self-update --profile=minimal
          cargo -V

      - name: Caching
        uses: Swatinem/rust-cache@v2
        with:
          key: test-${{ matrix.target }}

      - name: Tests (default)
        shell: bash
        run: |
          set -e
          cargo test --lib --tests

      - name: Tests (force_software)
        shell: bash
        run: |
          set -e
          cargo test --lib --tests --features=force_software

      - name: Tests (force_runtime_detection)
        shell: bash
        run: |
          set -e
          cargo test --lib --tests --features=force_runtime_detection

      - name: Tests no-std
        shell: bash
        run: |
          set -e
          cargo test --lib --tests --no-default-features

      - name: Tests no-std (force_software)
        shell: bash
        run: |
          set -e
          cargo test --lib --tests --no-default-features --features=force_software

  verification:
    timeout-minutes: 30

    strategy:
      fail-fast: false
      matrix:
        include:
          - name: aarch64
            arch: aarch64
            target: aarch64-unknown-linux-gnu
          - name: riscv64
            arch: riscv64
            target: riscv64gc-unknown-linux-gnu
          - name: x86
            arch: i686
            target: i686-unknown-linux-gnu
          - name: x86_64
            arch: x86-64
            target: x86_64-unknown-linux-gnu

    name: Validate ${{ matrix.name }}
    runs-on: ubuntu-24.04
    needs: [ check ]

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4

      - uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: qemu-user qemu-user-static gcc-${{ matrix.arch }}-linux-gnu
          version: 1.0

      - name: Install toolchain
        run: |
          rustup toolchain install stable --no-self-update --profile=minimal --target ${{ matrix.target }}
          rustup override set stable
          cargo -V

      - name: Caching
        uses: Swatinem/rust-cache@v2
        with:
          key: verification-${{ matrix.target }}

      - name: Run verification
        shell: bash
        run: |
          set -e
          chmod +x scripts/run_verification.sh
          ./scripts/run_verification.sh ${{ matrix.name }}
