vacant 0.3.2

Fast domain availability checker. Asks authoritative TLD nameservers directly instead of WHOIS.
Documentation
name: Release

on:
  push:
    branches: [main]
  workflow_dispatch:

permissions:
  contents: write
  pull-requests: write

jobs:
  release-please:
    runs-on: ubuntu-latest
    outputs:
      release_created: ${{ steps.release.outputs.release_created }}
      tag_name: ${{ steps.release.outputs.tag_name }}
      version: ${{ steps.release.outputs.version }}
    steps:
      - uses: googleapis/release-please-action@v5
        id: release
        with:
          config-file: .release-please-config.json
          manifest-file: .release-please-manifest.json

  publish-crate:
    needs: release-please
    if: ${{ needs.release-please.outputs.release_created }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          ref: ${{ needs.release-please.outputs.tag_name }}
      - uses: dtolnay/rust-toolchain@stable
      - run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}

  build-binaries:
    needs: release-please
    if: ${{ needs.release-please.outputs.release_created }}
    permissions:
      contents: write
    strategy:
      fail-fast: false
      matrix:
        include:
          - target: aarch64-apple-darwin
            os: macos-latest
          - target: x86_64-apple-darwin
            os: macos-latest
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-latest
          - target: x86_64-unknown-linux-gnu
            os: ubuntu-latest
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v6
        with:
          ref: ${{ needs.release-please.outputs.tag_name }}

      - uses: houseabsolute/actions-rust-cross@v1.0.7
        with:
          target: ${{ matrix.target }}
          args: --release --locked
          strip: true

      - name: Create archive
        run: |
          cd target/${{ matrix.target }}/release
          tar -czvf ../../../vacant-${{ matrix.target }}.tar.gz vacant

      - name: Upload to release
        uses: softprops/action-gh-release@v3
        with:
          tag_name: ${{ needs.release-please.outputs.tag_name }}
          files: vacant-${{ matrix.target }}.tar.gz

  brew-formula:
    needs: [release-please, build-binaries]
    if: ${{ needs.release-please.outputs.release_created }}
    runs-on: ubuntu-latest
    steps:
      - name: Download release tarballs
        env:
          GH_TOKEN: ${{ github.token }}
          TAG: ${{ needs.release-please.outputs.tag_name }}
        run: |
          for target in aarch64-apple-darwin x86_64-apple-darwin aarch64-unknown-linux-gnu x86_64-unknown-linux-gnu; do
            gh release download "$TAG" --repo "$GITHUB_REPOSITORY" --pattern "vacant-$target.tar.gz"
          done

      - name: Generate and push formula
        env:
          GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
          VERSION: ${{ needs.release-please.outputs.version }}
        run: |
          MAC_ARM_SHA=$(sha256sum vacant-aarch64-apple-darwin.tar.gz | awk '{print $1}')
          MAC_INTEL_SHA=$(sha256sum vacant-x86_64-apple-darwin.tar.gz | awk '{print $1}')
          LINUX_ARM_SHA=$(sha256sum vacant-aarch64-unknown-linux-gnu.tar.gz | awk '{print $1}')
          LINUX_INTEL_SHA=$(sha256sum vacant-x86_64-unknown-linux-gnu.tar.gz | awk '{print $1}')

          BASE_URL="https://github.com/alltuner/vacant/releases/download/v${VERSION}"

          FORMULA_CONTENT=$(cat <<RUBY
          class Vacant < Formula
            desc "Fast domain availability checker via authoritative DNS"
            homepage "https://github.com/alltuner/vacant"
            version "${VERSION}"
            license "MIT"

            on_macos do
              if Hardware::CPU.arm?
                url "${BASE_URL}/vacant-aarch64-apple-darwin.tar.gz"
                sha256 "${MAC_ARM_SHA}"
              else
                url "${BASE_URL}/vacant-x86_64-apple-darwin.tar.gz"
                sha256 "${MAC_INTEL_SHA}"
              end
            end

            on_linux do
              if Hardware::CPU.arm?
                url "${BASE_URL}/vacant-aarch64-unknown-linux-gnu.tar.gz"
                sha256 "${LINUX_ARM_SHA}"
              else
                url "${BASE_URL}/vacant-x86_64-unknown-linux-gnu.tar.gz"
                sha256 "${LINUX_INTEL_SHA}"
              end
            end

            def install
              bin.install "vacant"
            end

            test do
              assert_match version.to_s, shell_output("#{bin}/vacant --version")
            end
          end
          RUBY
          )

          ENCODED=$(echo "$FORMULA_CONTENT" | base64 -w 0)
          EXISTING_SHA=$(gh api repos/alltuner/homebrew-tap/contents/Formula/vacant.rb -q '.sha' 2>/dev/null || true)

          if [ -n "$EXISTING_SHA" ]; then
            gh api repos/alltuner/homebrew-tap/contents/Formula/vacant.rb \
              --method PUT \
              -f message="vacant: update to v${VERSION}" \
              -f content="$ENCODED" \
              -f sha="$EXISTING_SHA"
          else
            gh api repos/alltuner/homebrew-tap/contents/Formula/vacant.rb \
              --method PUT \
              -f message="vacant: add formula at v${VERSION}" \
              -f content="$ENCODED"
          fi