# crates.io への公開ワークフロー(タグ駆動)
#
# `v<バージョン>` 形式のタグ(例: v0.2.0)を push すると、タグと Cargo.toml の
# バージョン一致を検証し、テストを実行したうえで `cargo publish` を行い、
# 続けて前回リリースからの変更点を載せた GitHub Release を作成する。
#
# 事前準備: GitHub の Environment `crates-io` に Secret `CARGO_REGISTRY_TOKEN`
#           (crates.io の API トークン)を登録しておくこと。Environment の
#           保護ルール(必須レビュー等)を設定すれば公開前の承認も挟める。
#
# 公開手順の例:
#   1. Cargo.toml の version を更新してコミット・push
#   2. git tag v0.2.0 && git push origin v0.2.0
name: Publish

on:
  push:
    tags:
      - "v*"

permissions:
  contents: write

jobs:
  publish:
    runs-on: ubuntu-latest
    environment:
      name: crates-io
      url: https://crates.io/crates/narashi
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache cargo build
        uses: Swatinem/rust-cache@v2

      - name: Verify tag matches Cargo.toml version
        run: |
          tag="${GITHUB_REF_NAME#v}"
          crate="$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')"
          echo "tag=$tag crate=$crate"
          if [ "$tag" != "$crate" ]; then
            echo "::error::タグ v$tag が Cargo.toml の version $crate と一致しません"
            exit 1
          fi

      - name: Run tests
        run: cargo test --locked

      - name: Publish to crates.io
        run: cargo publish --locked --token "${{ secrets.CARGO_REGISTRY_TOKEN }}"

      - name: Create GitHub Release
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # --generate-notes で前回のリリース(タグ)からの変更点を自動生成して本文にする
          gh release create "$GITHUB_REF_NAME" \
            --title "$GITHUB_REF_NAME" \
            --verify-tag \
            --generate-notes
