name: Rust

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

env:
  CARGO_TERM_COLOR: always

jobs:
  miri:
    name: "Miri"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install Miri
        run: |
          rustup toolchain install nightly --component miri
          rustup override set nightly
          cargo miri setup
      - name: Test (default) with Miri
        run: MIRIFLAGS=-Zmiri-strict-provenance cargo miri test
      - name: Test (default) with Miri + Tree Borrows
        run: MIRIFLAGS="-Zmiri-strict-provenance -Zmiri-tree-borrows" cargo miri test
      # AutoThinVec needs tree borrows.
      - name: Test (gecko-ffi) with Miri
        run: MIRIFLAGS="-Zmiri-strict-provenance -Zmiri-tree-borrows" cargo miri test --features=gecko-ffi
      - name: Test (unstable features) with Miri
        run: MIRIFLAGS=-Zmiri-strict-provenance cargo miri test --features=unstable

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build
      run: cargo build --verbose
    - name: Build (malloc_size_of)
      run: cargo build --features=malloc_size_of --verbose
    - name: Run tests
      run: cargo test --verbose
    - name: Run tests
      run: cargo test --verbose
    - name: Run tests (serde)
      run: cargo test --features=serde --verbose
    - name: Run tests (gecko-ffi)
      run: cargo test --tests --features=gecko-ffi --verbose
    - name: Run tests (no_std)
      run: cargo test --tests --no-default-features --verbose

  msrv:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: 1.53
          override: true
      - run: cargo +1.53 check

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


  clippy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions-rs/toolchain@v1
        with:
            toolchain: stable
            profile: minimal
            components: clippy
            override: true
      - uses: actions-rs/clippy-check@v1
        env:
          PWD: ${{ env.GITHUB_WORKSPACE }}
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          args: --workspace --tests --examples


  docs:
    runs-on: ubuntu-latest
    env:
      RUSTDOCFLAGS: -Dwarnings
    steps:
      - uses: actions/checkout@v2
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          profile: minimal
          components: rust-docs
          override: true
      - uses: swatinem/rust-cache@v1
      - uses: actions-rs/cargo@v1
        with:
          command: doc
          args: --workspace --no-deps
