version: 2

# global environment variables
# '& ' syntax is a YAML thing for creating referenceable documents
env-shared: &env-shared
  environment:
    GOFLAGS: "-mod=vendor"

# build steps shared across different jobs
build-shared: &build-shared
  steps:
    - checkout
    - run:
        name: Run gofmt -s
        command: |
          if [ $(find . ! -path "./vendor/*" -name "*.go" -exec gofmt -s -d {} \;|wc -l) -gt 0 ]; then
           find . ! -path "./vendor/*" -name "*.go" -exec gofmt -s -d {} \;
           exit 1;
          fi
    - restore_cache:
        keys:
          - pkg-cache-{{ checksum "go.sum" }}-v5
    - run:
        name: Run tests
        command: |
          go test -v ./...
    - run:
        name: Get gox
        # -mod=vendor doesn't work with go get while in source tree with go.mod in it
        working_directory: "/tmp"
        command: |
          go get github.com/mitchellh/gox
    - run:
        name: Compile project on every platform
        command: |
          gox -parallel 10 -os "linux freebsd" -osarch "darwin/i386 darwin/amd64 windows/i386 windows/amd64"
    - save_cache:
        key: pkg-cache-{{ checksum "go.sum" }}-v5
        paths:
          - ~/.cache/go-build

jobs:
  # matrix build jobs run on every commit
  # building on versioned Go and the latest one
  # '<<: *' syntax is a YAML thing for including documents
  "golang:1.17":
    <<: *env-shared
    <<: *build-shared
    docker:
      - image: circleci/golang:1.17
  "golang:latest":
    <<: *env-shared
    <<: *build-shared
    docker:
      - image: circleci/golang:latest
  # release job run only when a commit is tagged
  release:
    <<: *env-shared
    docker:
      - image: circleci/golang:1.17
    steps:
      - checkout
      - run:
          name: Run gorelease
          command: |
            curl -sL https://git.io/goreleaser | bash
      - run:
          name: Update docs
          command: |
            ./.circleci/update_docs.sh

workflows:
  version: 2
  build:
    jobs:
      # build matrix
      - "golang:1.17"
      - "golang:latest"
  release:
    jobs:
      - release:
          filters:
            tags:
              only: /v[0-9]+(\.[0-9]+)*/
            branches:
              ignore: /.*/
