name: Rust

on:
  push:
    paths-ignore:
      - '**.md'
  pull_request:
    paths-ignore:
      - '**.md'

env:
  CARGO_TERM_COLOR: always

jobs:
  build:
    strategy:
      matrix:
        include:
        - name: windows-latest
          runs-on: [self-hosted, Windows]
          self-hosted: true
        - name: ubuntu-latest
          runs-on: ubuntu-latest
          self-hosted: false
        - name: macos-latest
          runs-on: macos-latest
          self-hosted: false
      fail-fast: false
    name: ${{ matrix.name }}
    runs-on: ${{ matrix.runs-on }}
    steps:
    - uses: actions/checkout@v4
    - run: rustup toolchain install stable
    - uses: Swatinem/rust-cache@v2
      if: ${{ ! matrix.self-hosted }}
      with:
        shared-key: ${{ matrix.name }}
    - name: Build tests
      run: cargo build --profile=CI --verbose --tests
    - name: Run tests
      run: cargo test --profile=CI --verbose
    - name: Build examples
      run: cargo build --profile=CI --verbose --bins
  clippy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - run: rustup toolchain install stable --component clippy
    - uses: Swatinem/rust-cache@v2
      with:
        shared-key: ubuntu-latest
        save-if: "false"
    - name: Run clippy check
      run: cargo clippy --profile=CI -- -Dwarnings
  fmt:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - run: rustup toolchain install nightly --component rustfmt
    - name: Run fmt check
      run: cargo +nightly fmt --check
  typos:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Run typos
      uses: crate-ci/typos@master
