mandate 0.1.0

Convert Markdown or YAML manuals into roff manpages
Documentation
name: ci

on:
  pull_request:
  push:
    branches:
      - main
  workflow_dispatch:

concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  lint:
    name: lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8  # v6.0.1

      - name: Rust toolchain
        uses: dtolnay/rust-toolchain@f7ccc83f9ed1e5b9c81d8a67d7ad1a747e22a561
        with:
          toolchain: stable
          components: rustfmt, clippy

      - name: Rust cache
        uses: ./.github/actions/setup-rust-cache
        with:
          cache-key-suffix: lint
          toolchain: stable

      - name: rustfmt
        run: cargo fmt --check

      - name: clippy
        run: cargo clippy --all-targets --all-features -- -D warnings

  test:
    name: test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8  # v6.0.1

      - name: Rust toolchain
        uses: dtolnay/rust-toolchain@f7ccc83f9ed1e5b9c81d8a67d7ad1a747e22a561
        with:
          toolchain: stable

      - name: Rust cache
        uses: ./.github/actions/setup-rust-cache
        with:
          cache-key-suffix: test
          toolchain: stable

      - name: Install nextest
        uses: ./.github/actions/setup-cargo-tools
        with:
          binstall-tools: cargo-nextest

      - name: nextest
        run: cargo nextest run --profile ci

      - name: doctests
        run: cargo test --doc

  msrv:
    name: msrv
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8  # v6.0.1

      - name: Read MSRV
        id: msrv
        shell: bash
        run: |
          set -euo pipefail
          if [ ! -f Cargo.toml ]; then
            echo "found=false" >>"$GITHUB_OUTPUT"
            exit 0
          fi

          msrv="$(awk -F= '
            /^[[:space:]]*rust-version[[:space:]]*=/ {
              v=$2
              gsub(/^[[:space:]]+|[[:space:]]+$/, "", v)
              gsub(/"/, "", v)
              print v
              exit
            }
          ' Cargo.toml || true)"

          if [ -z "${msrv}" ]; then
            echo "found=false" >>"$GITHUB_OUTPUT"
            exit 0
          fi

          echo "found=true" >>"$GITHUB_OUTPUT"
          echo "msrv=${msrv}" >>"$GITHUB_OUTPUT"

      - name: Rust toolchain (MSRV)
        if: steps.msrv.outputs.found == 'true'
        uses: dtolnay/rust-toolchain@f7ccc83f9ed1e5b9c81d8a67d7ad1a747e22a561
        with:
          toolchain: ${{ steps.msrv.outputs.msrv }}

      - name: Rust cache
        if: steps.msrv.outputs.found == 'true'
        uses: ./.github/actions/setup-rust-cache
        with:
          cache-key-suffix: msrv
          toolchain: ${{ steps.msrv.outputs.msrv }}

      - name: cargo check (MSRV)
        if: steps.msrv.outputs.found == 'true'
        run: cargo check --all-targets --all-features