name: Check Protocol Buffers

env:
  # See: https://github.com/actions/setup-go/tree/main#supported-version-syntax
  GO_VERSION: "1.17"

# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows
on:
  create:
  push:
    paths:
      - ".github/workflows/check-protobuf-task.ya?ml"
      - "Taskfile.ya?ml"
      - "rpc/**"
  pull_request:
    paths:
      - ".github/workflows/check-protobuf-task.ya?ml"
      - "Taskfile.ya?ml"
      - "rpc/**"
  workflow_dispatch:
  repository_dispatch:

jobs:
  run-determination:
    runs-on: ubuntu-latest
    outputs:
      result: ${{ steps.determination.outputs.result }}
    steps:
      - name: Determine if the rest of the workflow should run
        id: determination
        run: |
          RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x"
          # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead.
          if [[ \
            "${{ github.event_name }}" != "create" || \
            "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX \
          ]]; then
            # Run the other jobs.
            RESULT="true"
          else
            # There is no need to run the other jobs.
            RESULT="false"
          fi

          echo "::set-output name=result::$RESULT"

  build:
    needs: run-determination
    if: needs.run-determination.outputs.result == 'true'
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Install Go
        uses: actions/setup-go@v3
        with:
          go-version: ${{ env.GO_VERSION }}

      - name: Install protoc compiler
        uses: arduino/setup-protoc@v1
        with:
          version: v3.16.0
          repo-token: ${{ secrets.GITHUB_TOKEN }}

      - name: Install Go deps
        run: |
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26.0
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1.0

      - name: Install Task
        uses: arduino/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          version: 3.x

      - name: Check protocol buffers compile correctly
        if: runner.os == 'Linux'
        run: task protoc:compile

  check:
    needs: run-determination
    if: needs.run-determination.outputs.result == 'true'
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Install Go
        uses: actions/setup-go@v3
        with:
          go-version: ${{ env.GO_VERSION }}

      - name: Install buf (protoc linter)
        run: |
          go install github.com/bufbuild/buf/cmd/buf@v1.4.0
          go install github.com/bufbuild/buf/cmd/protoc-gen-buf-breaking@v1.4.0
          go install github.com/bufbuild/buf/cmd/protoc-gen-buf-lint@v1.4.0

      - name: Install Task
        uses: arduino/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          version: 3.x

      - name: Lint protocol buffers
        run: task protoc:check

  check-formatting:
    needs: run-determination
    if: needs.run-determination.outputs.result == 'true'
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Install Task
        uses: arduino/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          version: 3.x

      - name: Format protocol buffers
        run: task protoc:format

      - name: Check formatting
        run: git diff --color --exit-code
