name: CI

on:
  pull_request:
    paths:
      - '**.rs'
      - '**.toml'
      - '.github/workflows/ci.yml'
  push:
    branches: [master]
    paths:
      - '**.rs'
      - '**.toml'
      - '.github/workflows/ci.yml'

jobs:
  Check_Formatting:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: hecrj/setup-rust-action@v1
      with:
        rust-version: stable
        components: rustfmt
    - name: Check Formatting
      run: cargo +stable fmt --all -- --check

  Tests:
    strategy:
      fail-fast: false
      matrix:
        rust_version: [stable, nightly]
        platform:
          - { target: x86_64-pc-windows-msvc,   os: windows-latest,  }
          - { target: i686-pc-windows-msvc,     os: windows-latest,  }
          - { target: x86_64-pc-windows-gnu,    os: windows-latest, host: -x86_64-pc-windows-gnu }
          - { target: i686-pc-windows-gnu,      os: windows-latest, host: -i686-pc-windows-gnu }
          - { target: i686-unknown-linux-gnu,   os: ubuntu-latest,   }
          - { target: x86_64-unknown-linux-gnu, os: ubuntu-latest,   }
          - { target: x86_64-unknown-linux-gnu, os: ubuntu-latest, options: --no-default-features, features: x11 }
          - { target: x86_64-unknown-linux-gnu, os: ubuntu-latest, options: --no-default-features, features: wayland }
          - { target: aarch64-linux-android,    os: ubuntu-latest,  cmd: 'apk --' }
          - { target: x86_64-apple-darwin,      os: macos-latest,    }
          - { target: x86_64-apple-ios,         os: macos-latest,    }
          - { target: aarch64-apple-ios,        os: macos-latest,    }
          # We're using Windows rather than Ubuntu to run the wasm tests because caching cargo-web
          # doesn't currently work on Linux.
          - { target: wasm32-unknown-unknown,   os: windows-latest, features: stdweb,  cmd: web }
          - { target: wasm32-unknown-unknown,   os: windows-latest, features: web-sys, cmd: web }

    env:
      RUST_BACKTRACE: 1
      CARGO_INCREMENTAL: 0
      RUSTFLAGS: "-C debuginfo=0"
      OPTIONS: ${{ matrix.platform.options }}
      FEATURES: ${{ format(',{0}', matrix.platform.features ) }}
      CMD: ${{ matrix.platform.cmd }}

    runs-on: ${{ matrix.platform.os }}
    steps:
    - uses: actions/checkout@v2
    # Used to cache cargo-web
    - name: Cache cargo folder
      uses: actions/cache@v1
      with:
        path: ~/.cargo
        key: ${{ matrix.platform.target }}-cargo-${{ matrix.rust_version }}

    - uses: hecrj/setup-rust-action@v1
      with:
        rust-version: ${{ matrix.rust_version }}${{ matrix.platform.host }}
        targets: ${{ matrix.platform.target }}

    - name: Install GCC Multilib
      if: (matrix.platform.os == 'ubuntu-latest') && contains(matrix.platform.target, 'i686')
      run: sudo apt-get update && sudo apt-get install gcc-multilib
    - name: Install cargo-apk
      if: contains(matrix.platform.target, 'android')
      run: cargo install cargo-apk
    - name: Install cargo-web
      continue-on-error: true
      if: contains(matrix.platform.target, 'wasm32')
      run: cargo install cargo-web

    - name: Check documentation
      shell: bash
      if: matrix.platform.target != 'wasm32-unknown-unknown'
      run: cargo $CMD doc --no-deps --target ${{ matrix.platform.target }} $OPTIONS --features $FEATURES

    - name: Build
      shell: bash
      run: cargo $CMD build --verbose --target ${{ matrix.platform.target }} $OPTIONS --features $FEATURES

    - name: Build tests
      shell: bash
      run: cargo $CMD test --no-run --verbose --target ${{ matrix.platform.target }} $OPTIONS --features $FEATURES
    - name: Run tests
      shell: bash
      if: (
        !contains(matrix.platform.target, 'android') &&
        !contains(matrix.platform.target, 'ios') &&
        !contains(matrix.platform.target, 'wasm32'))
      run: cargo $CMD test --verbose --target ${{ matrix.platform.target }} $OPTIONS --features $FEATURES


    - name: Build with serde enabled
      shell: bash
      run: cargo $CMD build --verbose --target ${{ matrix.platform.target }} $OPTIONS --features serde,$FEATURES

    - name: Build tests with serde enabled
      shell: bash
      run: cargo $CMD test --no-run --verbose --target ${{ matrix.platform.target }} $OPTIONS --features serde,$FEATURES
    - name: Run tests with serde enabled
      shell: bash
      if: (
        !contains(matrix.platform.target, 'android') &&
        !contains(matrix.platform.target, 'ios') &&
        !contains(matrix.platform.target, 'wasm32'))
      run: cargo $CMD test --verbose --target ${{ matrix.platform.target }} $OPTIONS --features serde,$FEATURES