hubworld 0.3.1

A Rust library for generating random data: UUIDs, names, passwords, and credit cards
Documentation
name: PR

on:
  pull_request:
    types: [opened, synchronize, reopened]

env:
  CARGO_TERM_COLOR: always

jobs:
  dispatch:
    if: github.event.pull_request.head.repo.fork == false
    runs-on: ubuntu-latest
    permissions:
      contents: read
    outputs:
      command: ${{ steps.extract.outputs.command }}
    steps:
      - name: Extract command
        id: extract
        uses: actions/github-script@v7
        with:
          script: |
            core.setOutput('command', 'review');

  ci:
    needs: dispatch
    if: ${{ needs.dispatch.outputs.command == 'review' }}
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt, clippy

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2

      - name: Check formatting
        run: cargo fmt --all -- --check

      - name: Lint
        run: cargo clippy --all-targets --all-features -- -D warnings

      - name: Run tests
        run: cargo test --all-targets --all-features --verbose

  e2e:
    needs: [dispatch, ci]
    if: ${{ needs.dispatch.outputs.command == 'review' && needs.ci.result == 'success' }}
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@v4

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

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2

      - name: Build release artifacts
        run: cargo build --release --verbose

  review:
    needs: [dispatch, ci, e2e]
    if: needs.dispatch.outputs.command == 'review' && needs.ci.result == 'success' && needs.e2e.result == 'success'
    runs-on: ubuntu-latest
    timeout-minutes: 7
    permissions:
      contents: read
      issues: write
      pull-requests: write
    steps:
      - uses: actions/checkout@v4

      - name: Get PR diff and build prompt
        id: prep
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          PR_NUMBER=${{ github.event.pull_request.number || github.event.issue.number }}
          echo "pr_number=${PR_NUMBER}" >> $GITHUB_OUTPUT

          DIFF=$(gh pr diff "${PR_NUMBER}" --repo ${{ github.repository }})

          PROMPT="You are an expert Rust code reviewer. Review the pull request diff below and provide a detailed review. Focus on: Rust safety issues, code quality, performance concerns, test coverage, and potential bugs. Return ONLY the review in markdown format.

          === DIFF ===
          ${DIFF}"

          echo "prompt<<EOF_PROMPT" >> $GITHUB_OUTPUT
          echo "${PROMPT}" >> $GITHUB_OUTPUT
          echo "EOF_PROMPT" >> $GITHUB_OUTPUT

      - name: Run Gemini review
        id: gemini
        uses: google-github-actions/run-gemini-cli@v0
        with:
          gemini_api_key: ${{ secrets.GEMINI_API_KEY }}
          gemini_model: gemini-2.5-flash-lite
          prompt: ${{ steps.prep.outputs.prompt }}

      - name: Post review comment
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          REVIEW: ${{ steps.gemini.outputs.summary }}
        run: |
          PR_NUMBER=${{ steps.prep.outputs.pr_number }}
          printf '%s' "${REVIEW}" > /tmp/review.txt
          printf "## Gemini Code Review\n\n" | cat - /tmp/review.txt > /tmp/full_review.txt
          gh pr comment "${PR_NUMBER}" --repo ${{ github.repository }} --body-file /tmp/full_review.txt

  approve:
    needs: [dispatch, ci, e2e, review]
    if: >
      needs.dispatch.outputs.command == 'review' &&
      needs.ci.result == 'success' &&
      needs.e2e.result == 'success' &&
      needs.review.result == 'success'
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - name: Approve PR
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          PR_NUMBER=${{ github.event.pull_request.number || github.event.issue.number }}
          gh pr review "${PR_NUMBER}" --repo ${{ github.repository }} --approve