tlafmt 0.4.1

A formatter for TLA+ specs
name: release
on:
  push:
    tags:
      - "v*.*.*"

permissions: {}

jobs:
  build:
    uses: ./.github/workflows/build.yml

  test:
    uses: ./.github/workflows/test.yml

  lint:
    uses: ./.github/workflows/lint.yml

  fuzz:
    uses: ./.github/workflows/fuzz.yml

  # Validate the crate version matches the tag.
  check_version:
    needs: [build, test, lint, fuzz]
    runs-on: ubuntu-latest
    env:
      REF_NAME: ${{ github.ref_name }}

    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Check crate version
        run: '[[ "v$(yq ''.package.version'' Cargo.toml)" == "$REF_NAME" ]]'

  # Create a github release
  github_release:
    needs: [build, test, lint, fuzz, check_version]

    permissions:
      contents: write

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Create GitHub release
        uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda
        with:
          generate_release_notes: true

  # Publish the crate (scoping the secret to only this job)
  publish_crate:
    needs: [build, test, lint, fuzz, github_release]
    env:
      CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}

    runs-on: ubuntu-latest
    container:
      image: rust:latest

    steps:
      - name: ensure node is installed for act
        if: ${{ env.ACT }}
        run: command -v node || (apt update && apt install -y nodejs)

      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Publish libtlafmt crate
        if: ${{ env.CARGO_REGISTRY_TOKEN != '' }}
        run: cargo publish -p libtlafmt

      - name: Publish tlafmt binary
        if: ${{ env.CARGO_REGISTRY_TOKEN != '' }}
        run: cargo publish -p tlafmt