openlogi 0.6.20

OpenLogi command-line interface — a local-first companion for Logitech HID++ peripherals.
name: CI

on:
  push:
    branches: [main, master]
  pull_request:

env:
  CARGO_TERM_COLOR: always
  CARGO_INCREMENTAL: 0
  RUSTFLAGS: "-D warnings"

jobs:
  fmt:
    name: rustfmt
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt
      - run: cargo fmt --all -- --check

  clippy:
    name: clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - uses: Swatinem/rust-cache@v2
      - run: |
          sudo apt-get update
          sudo apt-get install -y \
            libudev-dev \
            gcc g++ clang libfontconfig-dev libwayland-dev \
            libxkbcommon-x11-dev libx11-xcb-dev \
            libssl-dev libzstd-dev pkg-config
      - run: cargo clippy --workspace --all-targets -- -D warnings

  # Both first-class platforms: macOS and Linux compile disjoint cfg-gated
  # code (evdev/zbus vs the ObjC surface), so a single-runner MSRV check would
  # miss a too-new stabilization on the other side.
  msrv:
    name: MSRV (cargo check, ${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest]
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@1.96
      - uses: Swatinem/rust-cache@v2
      - if: runner.os == 'Linux'
        run: |
          sudo apt-get update
          sudo apt-get install -y \
            libudev-dev \
            gcc g++ clang libfontconfig-dev libwayland-dev \
            libxkbcommon-x11-dev libx11-xcb-dev \
            libssl-dev libzstd-dev pkg-config
      - run: cargo check --workspace --all-targets

  check-linux:
    name: cargo check (linux)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - run: |
          sudo apt-get update
          sudo apt-get install -y \
            libudev-dev \
            gcc g++ clang libfontconfig-dev libwayland-dev \
            libxkbcommon-x11-dev libx11-xcb-dev \
            libssl-dev libzstd-dev pkg-config
      - run: cargo check --workspace --all-targets

  docs-hid:
    name: rustdoc (hid crates)
    runs-on: ubuntu-latest
    env:
      RUSTDOCFLAGS: "-D warnings"
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - run: |
          sudo apt-get update
          sudo apt-get install -y \
            libudev-dev \
            pkg-config
      - run: cargo doc -p openlogi-hid --no-deps --document-private-items
      - run: cargo doc -p openlogi-hidpp --no-deps --document-private-items

  # openlogi-core / openlogi-hid / openlogi-assets / openlogi / openlogi-hook
  # all compile on Linux today (the hook crate has stubs for non-macOS targets).
  # openlogi-gui needs GPUI's wayland / x11 system libs; the same dependency set
  # the clippy job installs is sufficient. Test workspace there as well so the
  # config-roundtrip and binding suites run on a non-macOS host.
  test-linux:
    name: tests (linux)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - run: |
          sudo apt-get update
          sudo apt-get install -y \
            libudev-dev \
            gcc g++ clang libfontconfig-dev libwayland-dev \
            libxkbcommon-x11-dev libx11-xcb-dev \
            libssl-dev libzstd-dev pkg-config
      - run: cargo test --workspace --exclude openlogi-gui

  test-macos:
    name: tests (macos, ${{ matrix.arch }})
    runs-on: ${{ matrix.runner }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - arch: arm64
            runner: macos-latest
          - arch: x86_64
            runner: macos-15-intel
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - name: Verify runner architecture
        run: test "$(uname -m)" = "${{ matrix.arch }}"
      - run: cargo test --workspace --all-targets

  cargo-deny:
    name: cargo-deny
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: EmbarkStudios/cargo-deny-action@v2
        with:
          command: check

  clippy-windows:
    name: clippy (windows)
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - uses: Swatinem/rust-cache@v2
      # Whole workspace, matching the Linux jobs — GPUI's DirectX backend
      # covers the GUI on Windows. clippy subsumes `cargo check` and
      # additionally lints the Windows-only code paths (the WH_MOUSE_LL hook,
      # SendInput synthesis, native HID writer, the composite HID++ channel,
      # and the agent's HKCU-Run autostart) that the Linux/macOS clippy jobs
      # never compile.
      - run: cargo clippy --workspace --all-targets -- -D warnings