on:
  push:
    branches:
    - main
  pull_request:

name: CI
permissions:
  contents: read

jobs:
  clippy:
    name: Clippy ${{ matrix.rust }} / ${{ matrix.triple.target }}
    runs-on: ${{ matrix.triple.os }}
    strategy:
      matrix:
      # Borrowed from https://github.com/GuillaumeGomez/sysinfo/blob/master/.github/workflows/CI.yml#L45
        triple:
          - { os: 'ubuntu-latest',  target: 'x86_64-unknown-linux-gnu', cross: false }
          - { os: 'ubuntu-latest',  target: 'i686-unknown-linux-gnu', cross: true }
          - { os: 'macos-latest',   target: 'x86_64-apple-darwin', cross: false }
          - { os: 'windows-latest', target: 'x86_64-pc-windows-msvc', cross: false }
          # iOS
          - { os: 'macos-latest', target: 'aarch64-apple-ios', cross: true }
          - { os: 'macos-latest', target: 'x86_64-apple-ios', cross: true }
          ## ARM64
          - { os: 'ubuntu-latest', target: 'aarch64-unknown-linux-gnu', cross: true }
          - { os: 'ubuntu-latest', target: 'aarch64-unknown-linux-musl', cross: true }
          ## ARMv7
          - { os: 'ubuntu-latest', target: 'armv7-unknown-linux-gnueabihf', cross: true }
          - { os: 'ubuntu-latest', target: 'armv7-unknown-linux-musleabihf', cross: true }
          ## ARMv6
          - { os: 'ubuntu-latest', target: 'arm-unknown-linux-gnueabihf', cross: true }
          - { os: 'ubuntu-latest', target: 'arm-unknown-linux-musleabihf', cross: true }
          # Android
          - { os: 'ubuntu-latest', target: 'aarch64-linux-android', cross: true }
          - { os: 'ubuntu-latest', target: 'armv7-linux-androideabi', cross: true }
          - { os: 'ubuntu-latest', target: 'x86_64-linux-android', cross: true }
          - { os: 'ubuntu-latest', target: 'i686-linux-android', cross: true }

          # WASM
          - { os: 'ubuntu-latest', target: 'wasm32-unknown-unknown', cross: false, always_install_target: true }
        rust:
          - stable
          # MSRV
          - 1.48.0
    steps:
      - uses: actions/checkout@v2
        with:
          persist-credentials: false
      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: ${{ matrix.rust }}
          components: clippy

      - name: Install cross-target
        if: matrix.triple.cross || matrix.triple.always_install_target
        run: rustup target add ${{ matrix.triple.target }}

      - uses: actions-rs/cargo@v1
        with:
          command: clippy
          args: --target=${{ matrix.triple.target }} --manifest-path=Cargo.toml -- -D clippy::dbg_macro -D warnings -D missing_docs -F unused_must_use
          use-cross: ${{ matrix.triple.cross }}

  test:
    name: Test Desktop OSes
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
          - windows-latest
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v2
        with:
          persist-credentials: false
      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable

      - uses: actions-rs/cargo@v1
        with:
          command: test

  test_wasm:
    name: Test wasm32-unknown-unknown
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          persist-credentials: false
      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable

      - name: Install wasm-pack
        run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
      - name: Test wasm32
        run: |
          rustup target add wasm32-unknown-unknown
          wasm-pack test --firefox --headless -- --features "js"

  test_fallback:
    name: Check fallback implementation
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          persist-credentials: false
      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable

      - name: "Clippy"
      # Install a target that is obviously not supported and then check it to ensure
      # the fallback target stays in sync with the other platforms.
        run: |
          rustup target add x86_64-unknown-none
          cargo clippy --target x86_64-unknown-none -- -D clippy::dbg_macro -D warnings -D missing_docs -F unused_must_use

  fmt:
    name: Rustfmt
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          persist-credentials: false
      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          components: rustfmt
      - uses: actions-rs/cargo@v1
        with:
          command: fmt
          args: --all -- --check
