calloop 0.14.4

A callback-based event loop
Documentation
name: Continuous Integration

on:
    push:
        branches:
            - master
    pull_request:

jobs:
    lint:
        runs-on: ubuntu-latest

        steps:
            - name: Checkout sources
              uses: taiki-e/checkout-action@v1

            - uses: taiki-e/install-action@cargo-binstall

            - name: Rust toolchain
              run: |
                  rustup default stable
                  rustup component add rustfmt clippy

            - name: Cargo fmt
              run: cargo fmt --all -- --check

            - name: Clippy
              run: cargo clippy --workspace --all-targets --features "block_on executor" -- -D warnings

    ci-linux:
        name: CI

        needs:
            - lint

        strategy:
            fail-fast: false
            matrix:
                rust: ["1.71.1", "stable", "beta"]

        runs-on: "ubuntu-latest"

        steps:
            - name: Checkout sources
              uses: taiki-e/checkout-action@v1

            - name: Rust toolchain
              run: rustup default ${{ matrix.rust }}

            - name: Downgrade rayon
              if: ${{ matrix.rust == '1.71.1' }}
              run: cargo update --package rayon --precise 1.10.0

            - name: Downgrade half
              if: ${{ matrix.rust == '1.71.1' }}
              run: cargo update --package half --precise 2.4.0

            - name: Downgrade rayon-core
              if: ${{ matrix.rust == '1.71.1' }}
              run: cargo update --package rayon-core --precise 1.12.1

            - name: Run tests
              run: cargo test --features "block_on executor"

            - name: Run tests with signals
              run: cargo test --features "block_on executor signals"

            - name: Run book tests
              run: cargo test --all-features --manifest-path ./doc/Cargo.toml
              if: ${{ matrix.rust == 'stable' || matrix.rust == 'beta' }}

    ci-windows:
        name: CI (Windows)

        needs:
            - lint

        strategy:
            fail-fast: false
            matrix:
                rust: ["1.71.1", "stable"]

        runs-on: "windows-latest"

        steps:
            - name: Checkout sources
              uses: taiki-e/checkout-action@v1

            - name: Rust toolchain
              run: rustup default ${{ matrix.rust }}

            - name: Downgrade rayon
              if: ${{ matrix.rust == '1.71.1' }}
              run: cargo update --package rayon --precise 1.10.0

            - name: Downgrade half
              if: ${{ matrix.rust == '1.71.1' }}
              run: cargo update --package half --precise 2.4.0

            - name: Downgrade rayon-core
              if: ${{ matrix.rust == '1.71.1' }}
              run: cargo update --package rayon-core --precise 1.12.1

            - name: Run tests
              run: cargo test --features "block_on executor"

    coverage:
        name: Coverage

        needs:
            - ci-linux

        strategy:
            fail-fast: false
            matrix:
                os: ["ubuntu-latest", "macos-latest"]

        runs-on: ${{ matrix.os }}

        env:
            GRCOV_VERSION: "0.8.10"

        steps:
            - name: Checkout sources
              uses: taiki-e/checkout-action@v1

            - name: Rust toolchain
              run: |
                  rustup default nightly
                  rustup component add llvm-tools-preview

            - name: Get grcov latest version
              id: grcovversion
              run: echo "::set-output name=version::$(cargo search 'grcov' --limit 1 | head -n 1 | cut -d ' ' -f 3 | cut -d '"' -f 2)"

            - name: Install grcov
              run: cargo install grcov --version ${{ steps.grcovversion.outputs.version }}

            - name: Run tests
              run: cargo test --all-features
              env:
                  LLVM_PROFILE_FILE: "calloop-%p-%m.profraw"
                  RUSTFLAGS: "-Cinstrument-coverage --cfg coverage"

            - name: Coverage
              run: grcov . --binary-path ./target/debug -s . -t lcov --branch --llvm --ignore-not-existing --ignore 'examples/*' --ignore 'tests/*' --ignore '*/.cargo/registry/*' --excl-br-start "mod tests \{" --excl-start "mod tests \{" --excl-br-line "#\[derive\(" --excl-line "#\[derive\(" -o lcov.info

            - name: Upload to codecov.io
              uses: codecov/codecov-action@v5
              with:
                  files: ./lcov.info
                  flags: ${{ matrix.os }}

    doc:
        name: Documentation on Github Pages
        runs-on: ubuntu-latest

        needs:
            - ci-linux

        steps:
            - name: Checkout sources
              uses: taiki-e/checkout-action@v1

            - name: Rust toolchain
              run: rustup default beta

            # Combining these docs is order-dependent. The API docs must be copied
            # into mdBook's source directory for it to copy it to the output directory
            # as static content.

            - name: Build Documentation
              run: cargo doc --no-deps --features "block_on executor"

            - run: rsync -r target/doc/ doc/src/api

            - name: Build mdBook
              uses: peaceiris/actions-mdbook@v2
              with:
                  mdbook-version: "0.4.8"

            - run: mdbook build doc

            - name: Deploy
              uses: peaceiris/actions-gh-pages@v4
              if: ${{ github.event_name == 'push' }}
              with:
                  github_token: ${{ secrets.GITHUB_TOKEN }}
                  publish_dir: ./doc/book
                  force_orphan: true