name: Release

on:
  workflow_dispatch:
    inputs:
      type:
        description: "version bump type"
        default: "patch"
        required: true
        type: choice
        options:
          - patch
          - minor
          - major
      prerelease:
        description: "prerelease"
        default: false
        required: true
        type: boolean

env:
  CARGO_TERM_COLOR: always

jobs:
  #todo: cargo test beforehand

  bump:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    outputs:
      tag: ${{steps.tag.outputs.tag}}
    steps:
    - uses: actions/checkout@v4
    - name: Config git
      run: git config user.name github_actions && git config user.email nil
    - name: Install cargo-workspaces
      run: cargo install cargo-workspaces
    - name: BUMP!
      run: cargo ws version ${{inputs.type}} --no-individual-tags -y
    - name: Export version
      run: echo "tag=$(git describe --tags --abbrev=0)" >> $GITHUB_OUTPUT
      id: tag

  make-release:
    runs-on: ubuntu-latest
    needs: bump
    permissions:
      contents: write
    steps:
      - name: Create release
        id: create_release
        uses: softprops/action-gh-release@v3.0.2
        with:
          tag_name: ${{ needs.bump.outputs.tag }}
          draft: false
          prerelease: ${{ inputs.prerelease }}
          generate_release_notes: true

  binary:
    runs-on: ${{matrix.os}}
    needs: [bump, make-release]
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        include:
          - os: ubuntu-latest
            filestub: starbloom-linux
            filesuffix:
          - os: macos-latest
            filestub: macos
            filesuffix:
          - os: windows-latest
            filestub: windows
            filesuffix: ".exe"
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
      - name: Get latest commit
        run: git pull
      - name: Build binary
        run: cargo build --release --features native_release
      - name: Upload binary
        uses: softprops/action-gh-release@v3.0.2
        with:
          tag_name: ${{ needs.bump.outputs.tag }}
          files: ./target/release/starbloom${{matrix.filesuffix}}
  
  publish:
    runs-on: ubuntu-latest
    needs: bump
    permissions:
      id-token: write
    steps:
    - uses: actions/checkout@v4
    - name: Get latest commit
      run: git pull
    - name: Authenticate to crates.io
      uses: rust-lang/crates-io-auth-action@v1.0.5
      id: auth
    - name: Publish to crates.io
      run: cargo publish --workspace
      env:
        CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}