rtactor 0.6.0

An Actor framework specially designed for Real-Time constrained use cases.
Documentation
name: Publish

on:
  release:
    types: [published]

# Uncomment the following lines to enable manual triggering of the workflow
#   workflow_dispatch:
#     inputs:
#         tag_name:
#           description: "Tag name to simulate the release version"
#           required: true
#           type: string
  
jobs:
  checks:
    name: Pre-publish checks
    runs-on: ubuntu-24.04
    outputs:
        version: ${{ steps.expected-version.outputs.expected_version }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Rust version of rtactor
        id: rust-version
        run: |
          echo "app_version=$(head -6 Cargo.toml | grep version | sed 's/"/ /g' | awk '{print $3}')" >> $GITHUB_OUTPUT

      - name: Rust version of rtactor-macros
        id: rust-version-macros
        run: |
          echo "app_version=$(head -6 rtactor-macros/Cargo.toml | grep version | sed 's/"/ /g' | awk '{print $3}')" >> $GITHUB_OUTPUT

      - name: Expected version
        id: expected-version
        run: |
          expected_version="${{ github.event_name == 'workflow_dispatch' && inputs.tag_name || github.event.release.tag_name }}"
          echo "expected_version=$expected_version" >> $GITHUB_OUTPUT

      - name: Display versions
        run: |
          echo "rtactor version: '${{ steps.rust-version.outputs.app_version }}'"
          echo "rtactor-macros version: '${{ steps.rust-version-macros.outputs.app_version }}'"
          echo "Expected version: '${{ steps.expected-version.outputs.expected_version }}'"

      - name: Validate that the crates versions matches the release TAG/version
        run: |
          if [[ "${{ steps.rust-version-macros.outputs.app_version }}" != "${{ steps.expected-version.outputs.expected_version }}" ]]; then
            echo "rtactor macros version mismatch: ${{ steps.rust-version-macros.outputs.app_version }} != ${{ steps.expected-version.outputs.expected_version }}"
            exit 1
          fi
          if [[ "${{ steps.rust-version.outputs.app_version }}" != "${{ steps.expected-version.outputs.expected_version }}" ]]; then
            echo "rtactor version mismatch: ${{ steps.rust-version.outputs.app_version }} != ${{ steps.expected-version.outputs.expected_version }}"
            exit 1
          fi

      - name: Validate token
        env:
            CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: |
          # Ensure the Cargo registry token is available
          if [ -z "$CARGO_REGISTRY_TOKEN" ]; then
            echo "Error: CARGO_REGISTRY_TOKEN is not set" >&2
            exit 1
          fi
  
  publish-macros:
    name: Publish rtactor-macros
    runs-on: ubuntu-24.04
    needs: checks
    steps:
      - name: Install toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.64.0

      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Display version
        run: |
          echo "publish version: '${{ needs.checks.outputs.version }}'"

      - name: Test publish rtactor-macros
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: cd rtactor-macros && cargo publish --dry-run

      - name: Publish rtactor-macros to crates.io
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: cd rtactor-macros && cargo publish

  wait:
    name: Wait for it to be available 
    runs-on: ubuntu-24.04
    needs: [checks, publish-macros]
    steps:
      - name: Install toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.64.0

      - name: Display version
        run: |
          echo "publish version: '${{ needs.checks.outputs.version }}'"
    
      - name: Wait for crate availability
        run: |
          set -e
          for i in {1..2}; do
            if cargo search rtactor-macros | grep -q '${{ needs.checks.outputs.version }}'; then
              echo "rtactor-macros version '${{ needs.checks.outputs.version }}' is available!"
              exit 0
            fi
            echo "Waiting for rtactor-macros version '${{ needs.checks.outputs.version }}' to be available..."
            sleep 30
          done
          echo "Timed out waiting for rtactor-macros version '${{ needs.checks.outputs.version }}'."
          exit 1
    
  publish-rtactor:
    name: Publish rtactor
    runs-on: ubuntu-24.04
    needs: [checks, publish-macros, wait]
    steps:
      - name: Install toolchain
        uses: dtolnay/rust-toolchain@master
        with:
            toolchain: 1.64.0

      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Display version
        run: |
          echo "publish version: '${{ needs.checks.outputs.version }}'"

      - name: Test publish rtactor
        env:
            CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: cargo publish --dry-run

      - name: Publish rtactor to crates.io
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: cargo publish