name: CI

on:
  push:
    branches: [master]
  pull_request:
    branches: [master]

env:
  CARGO_TERM_COLOR: always

jobs:
  build:
    strategy:
      matrix:
        toolchain: [stable, nightly]
        os: [windows-2019, ubuntu-20.04, macos-10.15]
        exclude:
          - os: macos-10.15
            toolchain: nightly
          - os: windows-2019
            toolchain: nightly
    runs-on: ${{ matrix.os }}
    needs: clean
    steps:
      - uses: actions/checkout@v2

      - uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain }}
          override: true

      - uses: actions/cache@v2
        with:
          path: |
            target
          key: ${{ runner.os }}-cargo-check-test-${{ matrix.toolchain }}-${{ hashFiles('**/Cargo.lock') }}

      - name: Install alsa
        run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev
        if: ${{ runner.os == 'Linux' }}

      - name: Install udev
        run: sudo apt-get update; sudo apt-get install --no-install-recommends libudev-dev
        if: ${{ runner.os == 'Linux' }}

      - name: Build
        run: cargo check
        env:
          CARGO_INCREMENTAL: 0
          RUSTFLAGS: "-C debuginfo=0 -D warnings"

      - name: Run tests
        run: cargo test --workspace
        if: ${{ runner.os == 'Linux' }}
        env:
          CARGO_INCREMENTAL: 0
          RUSTFLAGS: "-C debuginfo=0 -D warnings"

  build-wasm:
    strategy:
      matrix:
        toolchain: [stable, nightly]
        os: [ubuntu-20.04]
    runs-on: ${{ matrix.os }}
    needs: clean
    steps:
      - uses: actions/checkout@v2

      - uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain }}
          target: wasm32-unknown-unknown
          override: true

      - uses: actions/cache@v2
        with:
          path: |
            target
          key: ${{ runner.os }}-cargo-check-test-${{ matrix.toolchain }}-${{ hashFiles('**/Cargo.lock') }}

      - name: Check wasm
        uses: actions-rs/cargo@v1
        with:
          command: check
          args: --target wasm32-unknown-unknown --no-default-features --features bevy_winit,x11,hdr,bevy_gltf

  build-android:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Install Android targets
      run: rustup target add aarch64-linux-android armv7-linux-androideabi
    - name: Install Cargo APK
      run: cargo install cargo-apk
    - name: Build APK
      run: cargo apk build --example android

  clean:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - uses: actions-rs/toolchain@v1
        with:
          toolchain: nightly
          components: rustfmt, clippy
          override: true

      - name: Install alsa
        run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev

      - name: Install udev
        run: sudo apt-get update; sudo apt-get install --no-install-recommends libudev-dev

      - name: Check the format
        run: cargo +nightly fmt --all -- --check

      # type complexity must be ignored because we use huge templates for queries
      # -A clippy::manual-strip: strip_prefix support was added in 1.45. we want to support earlier rust versions
      - name: Run clippy
        run: cargo clippy --all-targets --all-features -- -D warnings -A clippy::type_complexity -A clippy::manual-strip
