name: CI

on:
  push:
    branches: ["main"]
  pull_request:

env:
  RUSTFLAGS: -Dwarnings
  RUST_BACKTRACE: 1
  MSRV: 1.42.0

jobs:
  build:
    name: Build (stable, ${{ matrix.target }})
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - x86_64-unknown-linux-gnu
          - i686-unknown-linux-musl
    steps:
      - uses: actions/checkout@master
      - name: Install toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          target: ${{ matrix.target }}
          override: true
      - name: cargo build --target ${{ matrix.target }}
        uses: actions-rs/cargo@v1
        with:
          command: build
          args: --all-targets --target ${{ matrix.target }}

  build-msrv:
    name: Build (MSRV)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: Install toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: ${{ env.MSRV }}
          override: true
      - name: cargo +${{ env.MSRV }} build
        uses: actions-rs/cargo@v1
        with:
          command: build
        env:
          RUSTFLAGS: "" # remove -Dwarnings

  build-nightly:
    name: Build (nightly)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: Install toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: nightly
          override: true
      - name: cargo +nightly build
        uses: actions-rs/cargo@v1
        with:
          command: build
        env:
          RUSTFLAGS: "" # remove -Dwarnings

  test:
    name: Tests (stable)
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: Install toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true
      - name: Run tests
        run: cargo test

  test-loom:
    name: Loom tests (stable)
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: Install toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true
      - name: Run Loom tests
        run: ./bin/loom.sh

  clippy:
    name: Clippy (stable)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          components: clippy
          override: true
      - name: cargo clippy --all-targets --all-features
        uses: actions-rs/clippy-check@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          args: --all-targets --all-features

  rustfmt:
    name: Rustfmt (stable)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          components: rustfmt
          override: true
      - name: Run rustfmt
        uses: actions-rs/cargo@v1
        with:
          command: fmt
          args: -- --check

  all-systems-go:
    name: "all systems go!"
    needs:
      - build
      - build-msrv
      # Note: we explicitly *don't* require the `build-nightly` job to pass,
      # since the nightly Rust compiler is unstable. We don't want nightly
      # regressions to break our build --- this CI job is intended for
      # informational reasons rather than as a gatekeeper for merging PRs.
      - test
      - test-loom
      - clippy
      - rustfmt
    runs-on: ubuntu-latest
    steps:
      - run: exit 0
