version: "3"

vars:
  DIST_DIR: "dist"
  DUMMY_DISCOVERY_VERSION:
    sh: echo "$(git describe --tags --dirty --broken)"
  DUMMY_DISCOVERY_TIMESTAMP:
    sh: echo "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
  DUMMY_DISCOVERY_LDFLAGS: >
    -X github.com/arduino/pluggable-discovery-protocol-handler/dummy-discovery/args.Tag={{.DUMMY_DISCOVERY_VERSION}}
    -X github.com/arduino/pluggable-discovery-protocol-handler/dummy-discovery/args.Timestamp={{.DUMMY_DISCOVERY_TIMESTAMP}}
  # Path of the project's primary Go module:
  DEFAULT_GO_MODULE_PATH: ./
  DEFAULT_GO_PACKAGES:
    sh: |
      echo $(cd {{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}} && go list ./... | tr '\n' ' ' || echo '"ERROR: Unable to discover Go packages"')
  # `-ldflags` flag to use for `go test` command
  TEST_LDFLAGS:

tasks:
  build-dummy-discovery:
    desc: Build the dummy-discovery client example
    vars:
      EXECUTABLE: dummy-discovery{{if eq OS "windows"}}.exe{{end}}
    cmds:
      - go build -o dist/{{.EXECUTABLE}} -v -ldflags '{{.DUMMY_DISCOVERY_LDFLAGS}}' ./dummy-discovery

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/test-go-task/Taskfile.yml
  go:test:
    desc: Run unit tests
    dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}"
    cmds:
      - |
        go test \
          -v \
          -short \
          -run '{{default ".*" .GO_TEST_REGEX}}' \
          {{default "-timeout 10m -coverpkg=./... -covermode=atomic" .GO_TEST_FLAGS}} \
          -coverprofile=coverage_unit.txt \
          {{.TEST_LDFLAGS}} \
          {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-workflows-task/Taskfile.yml
  ci:validate:
    desc: Validate GitHub Actions workflows against their JSON schema
    vars:
      # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/github-workflow.json
      WORKFLOW_SCHEMA_URL: https://json.schemastore.org/github-workflow
      WORKFLOW_SCHEMA_PATH:
        sh: mktemp -t workflow-schema-XXXXXXXXXX.json
      WORKFLOWS_DATA_PATH: "./.github/workflows/*.{yml,yaml}"
    cmds:
      - |
        wget \
          --quiet \
          --output-document="{{.WORKFLOW_SCHEMA_PATH}}" \
          {{.WORKFLOW_SCHEMA_URL}}
      - |
        npx \
          --package=ajv-cli \
          --package=ajv-formats \
          ajv validate \
            --all-errors \
            --strict=false \
            -c ajv-formats \
            -s "{{.WORKFLOW_SCHEMA_PATH}}" \
            -d "{{.WORKFLOWS_DATA_PATH}}"

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-dependencies-task/Taskfile.yml
  general:cache-dep-licenses:
    desc: Cache dependency license metadata
    cmds:
      - |
        if ! which licensed &>/dev/null; then
          if [[ "{{OS}}" == "windows" ]]; then
            echo "Licensed does not have Windows support."
            echo "Please use Linux/macOS or download the dependencies cache from the GitHub Actions workflow artifact."
          else
            echo "licensed not found or not in PATH. Please install: https://github.com/github/licensed#as-an-executable"
          fi
          exit 1
        fi
      - licensed cache

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-dependencies-task/Taskfile.yml
  general:check-dep-licenses:
    desc: Check for unapproved dependency licenses
    deps:
      - task: general:cache-dep-licenses
    cmds:
      - licensed status

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-general-formatting-task/Taskfile.yml
  general:check-formatting:
    desc: Check basic formatting style of all files
    cmds:
      - |
        if ! which ec &>/dev/null; then
          echo "ec not found or not in PATH. Please install: https://github.com/editorconfig-checker/editorconfig-checker#installation"
          exit 1
        fi
      - ec

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check-task/Taskfile.yml
  general:check-spelling:
    desc: Check for commonly misspelled words
    deps:
      - task: poetry:install-deps
    cmds:
      - poetry run codespell

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check-task/Taskfile.yml
  general:correct-spelling:
    desc: Correct commonly misspelled words where possible
    deps:
      - task: poetry:install-deps
    cmds:
      - poetry run codespell --write-changes

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml
  poetry:install-deps:
    desc: Install dependencies managed by Poetry
    cmds:
      - poetry install --no-root

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml
  poetry:update-deps:
    desc: Update all dependencies managed by Poetry to their newest versions
    cmds:
      - poetry update

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
  go:check:
    desc: Check for problems with Go code
    deps:
      - task: go:vet
      - task: go:lint

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
  go:vet:
    desc: Check for errors in Go code
    cmds:
      - go vet {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
  go:fix:
    desc: Modernize usages of outdated APIs
    cmds:
      - go fix {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
  go:lint:
    desc: Lint Go code
    cmds:
      - |
        if ! which golint &>/dev/null; then
          echo "golint not installed or not in PATH. Please install: https://github.com/golang/lint#installation"
          exit 1
        fi
      - |
        golint \
          {{default "-min_confidence 0.8 -set_exit_status" .GO_LINT_FLAGS}} \
          {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}

  # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-go-task/Taskfile.yml
  go:format:
    desc: Format Go code
    cmds:
      - go fmt {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}}
