name: Build and test

on: [push, pull_request]

env:
  CARGO_TERM_COLOR: always

jobs:

  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-latest, ubuntu-latest, windows-latest]
    steps:
      - uses: actions/checkout@v2

      - name: Build
        run: cargo build --workspace --verbose
        if: runner.os != 'Windows'

      - name: Build examples
        run: cargo build --workspace --examples --verbose
        if: runner.os != 'Windows'

      - name: Set up Rust nightly
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: nightly
          override: true
        if: runner.os == 'Windows'

      - name: Build (nightly)
        run: cargo +nightly build --workspace --all-features --verbose
        if: runner.os == 'Windows'

      - name: Build examples (nightly)
        run: cargo +nightly build --workspace --all-features --examples --verbose
        if: runner.os == 'Windows'

  build-arm:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          target: aarch64-unknown-linux-gnu
          override: true
      - uses: actions-rs/cargo@v1
        with:
          use-cross: true
          command: build
          args: --target aarch64-unknown-linux-gnu --workspace --verbose
          
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-latest, ubuntu-latest, windows-latest]
    steps:
      - uses: actions/checkout@v2

      - name: Run all tests
        run: cargo test --workspace --verbose
        if: runner.os == 'Linux'

      - name: Run all tests
        run: cargo test --workspace --exclude memflow-derive --verbose
        if: runner.os == 'macOS'

      - name: Set up Rust nightly
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: nightly
          override: true
        if: runner.os == 'Windows'

      - name: Run all tests (nightly)
        run: cargo +nightly test --workspace --exclude memflow-derive --all-features --verbose
        if: runner.os == 'Windows'

  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: rustup component add clippy
      - name: Check formatting
        run: cargo fmt -- --check
      - uses: actions-rs/clippy-check@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          args: --all-targets

  build-coverage:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Rust nightly
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: nightly
          override: true
      - run: cargo install grcov
      - name: Run tests with coverage
        run: |
          export CARGO_INCREMENTAL=0
          export RUSTFLAGS="-Zprofile -Ccodegen-units=1 -Copt-level=0 -Clink-dead-code -Coverflow-checks=off -Zpanic_abort_tests -Cpanic=abort"
          export RUSTDOCFLAGS="-Cpanic=abort"
          cargo build --workspace --exclude memflow-derive
          cargo test --workspace --exclude memflow-derive
          grcov ./target/debug/ -s . -t lcov --llvm --branch --ignore-not-existing -o ./target/debug/coverage
          bash <(curl -s https://codecov.io/bash) -f ./target/debug/coverage -t ${{ secrets.CODECOV_TOKEN }};
