qubit-json 0.8.1

Resource-aware infrastructure for lenient and strict JSON processing
Documentation
name: Rust Fuzz

on:
  schedule:
    - cron: "23 18 * * *"
  workflow_dispatch:

permissions:
  contents: read

concurrency:
  group: ${{ github.repository }}-${{ github.workflow }}
  cancel-in-progress: true

jobs:
  fuzz:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    strategy:
      fail-fast: false
      matrix:
        target: [decoder, json_decode_differential, json_budget_invariants, json_encode_invariants, json_tree_invariants]
    steps:
      - name: Checkout source
        uses: actions/checkout@v6
        with:
          fetch-depth: 1
          submodules: recursive

      - name: Restore fuzz corpus
        uses: actions/cache/restore@v4
        with:
          path: fuzz/corpus/${{ matrix.target }}
          key: ${{ matrix.target }}-fuzz-corpus-${{ runner.os }}-${{ github.run_id }}
          restore-keys: |
            ${{ matrix.target }}-fuzz-corpus-${{ runner.os }}-

      - name: Install Rust nightly
        run: rustup toolchain install nightly-2026-06-05 --profile minimal

      - name: Install cargo-fuzz
        run: cargo install cargo-fuzz --version 0.13.2 --locked

      - name: Fuzz target
        working-directory: fuzz
        run: cargo +nightly-2026-06-05 fuzz run ${{ matrix.target }} -- -max_total_time=300 -max_len=4096

      - name: Save fuzz corpus
        if: always()
        uses: actions/cache/save@v4
        with:
          path: fuzz/corpus/${{ matrix.target }}
          key: ${{ matrix.target }}-fuzz-corpus-${{ runner.os }}-${{ github.run_id }}

      - name: Upload fuzz artifacts
        if: failure()
        uses: actions/upload-artifact@v7
        with:
          name: ${{ matrix.target }}-fuzz-artifacts
          path: fuzz/artifacts/${{ matrix.target }}/**
          if-no-files-found: warn
          retention-days: 14