toon-encode 0.1.1

Minimal TOON encoder — Token-Oriented Object Notation for LLM output
Documentation
name: Release

on:
  push:
    branches: [main]

env:
  CARGO_TERM_COLOR: always

jobs:
  # Only trigger the release pipeline when the `version` field in Cargo.toml
  # actually changed in this push. Direct pushes to main that don't bump the
  # version (docs, refactors) skip publish entirely.
  version-check:
    name: Check version change
    runs-on: ubuntu-latest
    outputs:
      changed: ${{ steps.check.outputs.changed }}
      version: ${{ steps.check.outputs.version }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 2

      - name: Detect version change
        id: check
        run: |
          CURRENT=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')
          echo "version=$CURRENT" >> "$GITHUB_OUTPUT"
          if git diff HEAD~1 HEAD -- Cargo.toml | grep -q '^+version'; then
            echo "changed=true" >> "$GITHUB_OUTPUT"
            echo "Version changed to $CURRENT — will publish"
          else
            echo "changed=false" >> "$GITHUB_OUTPUT"
            echo "Version unchanged ($CURRENT) — skipping release"
          fi

  publish:
    name: Publish to crates.io
    needs: version-check
    if: needs.version-check.outputs.changed == 'true'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt, clippy
      - uses: Swatinem/rust-cache@v2

      - name: Format check
        run: cargo fmt --check

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

      - name: Test
        run: cargo test

      - name: Dry-run package
        run: cargo publish --dry-run

      - name: Publish
        run: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

  tag-and-release:
    name: Tag & GitHub Release
    needs: [version-check, publish]
    if: needs.version-check.outputs.changed == 'true'
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4

      - name: Create git tag
        run: |
          TAG="v${{ needs.version-check.outputs.version }}"
          git tag "$TAG"
          git push origin "$TAG"

      - name: GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: v${{ needs.version-check.outputs.version }}
          generate_release_notes: true