# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-go-task.md
name: Check Go

env:
  # See: https://github.com/actions/setup-go/tree/v3#readme
  GO_VERSION: "1.16"

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

jobs:
  check-errors:
    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 Task
        uses: arduino/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          version: 3.x

      - name: Check for errors
        run: task go:vet

  check-outdated:
    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 Task
        uses: arduino/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          version: 3.x

      - name: Modernize usages of outdated APIs
        run: task go:fix

      - name: Check if any fixes were needed
        run: git diff --color --exit-code

  check-style:
    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 Task
        uses: arduino/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          version: 3.x

      - name: Install golint
        run: go install golang.org/x/lint/golint@latest

      - name: Check style
        run: task --silent go:lint

  check-formatting:
    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 Task
        uses: arduino/setup-task@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          version: 3.x

      - name: Format code
        run: task go:format

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

  check-config:
    name: check-config (${{ matrix.module.path }})
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false

      matrix:
        module:
          - path: ./

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

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

      - name: Run go mod tidy
        working-directory: ${{ matrix.module.path }}
        run: go mod tidy

      - name: Check whether any tidying was needed
        run: git diff --color --exit-code
