rustversion-msrv 0.100.0

Conditional compilation according manifest MSRV
Documentation
name: CI

on:
  pull_request:
  merge_group: { types: [checks_requested] }
  push: { branches: [main] }
  schedule: [cron: "40 1 */2 * *"]

permissions:
  contents: read

jobs:
  read_msrv:
    name: Read MSRV
    uses: actions-rust-lang/msrv/.github/workflows/msrv.yml@v0.1.0

  test:
    name: Test Rust (${{ matrix.rust.name }})

    needs: read_msrv
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        # prettier-ignore
        rust:
          - { name: nightly, toolchain: nightly, expect_failure: true }
          - { name: beta, toolchain: beta, expect_failure: true }
          - { name: stable, toolchain: stable, expect_failure: true }
          - { name: msrv, toolchain: "${{ needs.read_msrv.outputs.msrv }}", expect_failure: false }

    steps:
      - uses: actions/checkout@v4

      - name: Install Rust (${{ matrix.rust.toolchain }})
        uses: actions-rust-lang/setup-rust-toolchain@v1.9.0
        with:
          toolchain: ${{ matrix.rust.toolchain }}

      - name: Enable type layout randomization
        run: echo RUSTFLAGS=${RUSTFLAGS}\ -Zrandomize-layout >> $GITHUB_ENV
        if: matrix.rust.toolchain == 'nightly'

      - run: |
          cargo update -p=trybuild --precise=1.0.89

      - name: Test
        shell: bash
        env:
          EXPECT_FAILURE: ${{ matrix.rust.expect_failure }}
        run: |
          set +e

          cargo test --test=msrv

          xc="$?"
          echo "exit code = $xc"

          if [[ "$EXPECT_FAILURE" == "true" ]]; then
            if [[ "$xc" == "0" ]]; then
              echo "Expected failure, got exit code = $xc"
              exit 1
            fi
          else
            if [[ "$xc" != "0" ]]; then
              echo "Expected success, got exit code = $xc"
              exit 1
            fi
          fi

  doc:
    name: Documentation
    runs-on: ubuntu-latest
    timeout-minutes: 45
    env:
      RUSTDOCFLAGS: -Dwarnings
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust (nightly)
        uses: actions-rust-lang/setup-rust-toolchain@v1.9.0
        with:
          toolchain: nightly

      - uses: dtolnay/install@cargo-docs-rs

      - run: cargo docs-rs

  clippy:
    name: Clippy
    runs-on: ubuntu-latest
    timeout-minutes: 45
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust (stable)
        uses: actions-rust-lang/setup-rust-toolchain@v1.9.0
        with:
          components: clippy

      - run: cargo clippy --tests -- -Dclippy::todo