name: CI

on:
  pull_request:
    branches:
      - master
  push:
    branches:
      - master

env:
  MSRV: "1.46.0"

jobs:
  stable:
    name: stable
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
          - windows-latest
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        run: rustup update stable --no-self-update
      - name: Test in debug mode
        run: cargo test --no-fail-fast
      - name: Test in release mode
        run: cargo test --no-fail-fast --release
      - name: Check with no default features
        run: cargo check --no-default-features
  nightly:
    name: nightly
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        run: rustup update nightly
      - name: Test in debug mode
        run: cargo +nightly test --no-fail-fast
      - name: Test in release mode
        run: cargo +nightly test --no-fail-fast --release
      - name: Check with no default features
        run: cargo +nightly check --no-default-features
      - name: Build benches
        run: cargo +nightly build --benches --all
  msrv:
    name: msrv
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        run: rustup update $MSRV && rustup default $MSRV
      - name: Test in debug mode
        run: cargo test --no-fail-fast
      - name: Test in release mode
        run: cargo test --no-fail-fast --release
      - name: Check with no default features
        run: cargo check --no-default-features
  asan:
    name: asan
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        run: rustup update nightly --no-self-update
      - name: Run address sanitizer
        run: RUSTFLAGS="-Z sanitizer=address" cargo +nightly test --lib --target x86_64-unknown-linux-gnu
        env:
          ASAN_OPTIONS: "detect_odr_violation=0 detect_leaks=0"
          RUST_BACKTRACE: "1"
  cross-test:
    name: cross-test
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - i686-unknown-linux-gnu
          - aarch64-unknown-linux-gnu
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        run: rustup update --no-self-update
      - name: Install Cross
        run: cargo install --force cross
      - name: Test
        run: cross test --target=${{ matrix.target }}
      - name: Check with no default features
        run: cross check --target=${{ matrix.target }} --no-default-features
  cross-check:
    name: cross-check
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - wasm32-unknown-unknown
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        run: rustup update --no-self-update
      - name: Add target
        run: rustup target add ${{ matrix.target }}
      - name: Check
        run: cargo check --target=${{ matrix.target }}
      - name: Check with no default features
        run: cargo check --target=${{ matrix.target }} --no-default-features
  cross-check-nightly-feature:
    name: cross-check-nightly-features
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - aarch64-unknown-linux-gnu
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        run: rustup update nightly --no-self-update && rustup default nightly
      - name: Add target
        run: rustup target add ${{ matrix.target }}
      - name: Check
        run: cargo check --target=${{ matrix.target }} --features=nightly
      - name: Check with no default features
        run: cargo check --target=${{ matrix.target }} --no-default-features --features=nightly
