#
# Golang CI pipeline configuration
#
# To execute linters in local the ./scripts/lint.sh script can be used.
version: "2"

formatters:
  enable:
    - gci # Gci controls golang package import order and makes it always deterministic. [fast: true, auto-fix: false]
    - gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification [fast: true, auto-fix: true]
    - gofumpt # Gofumpt checks whether code was gofumpt-ed. [fast: true, auto-fix: true]
    - goimports # In addition to fixing imports, goimports also formats your code in the same style as gofmt. [fast: true, auto-fix: true]
    - golines
  settings:
    gofmt:
      rewrite-rules:
        - pattern: interface{}
          replacement: any

linters:
  default: none
  # Run golangci-lint linters to see the list of all linters
  # Please keep them sorted alphabetically
  enable:
    - asasalint # check for pass []any as any in variadic func(...any) [fast: false, auto-fix: false]
    - asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers [fast: true, auto-fix: false]
    - bidichk # Checks for dangerous unicode character sequences [fast: true, auto-fix: false]
    - bodyclose # checks whether HTTP response body is closed successfully [fast: false, auto-fix: false]
    - canonicalheader # canonicalheader checks whether net/http.Header uses canonical header [fast: false, auto-fix: false]
    - copyloopvar # copyloopvar is a linter detects places where loop variables are copied [fast: true, auto-fix: false]
    - decorder # check declaration order and count of types, constants, variables and functions [fast: true, auto-fix: false]
    - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) [fast: true, auto-fix: false]
    - durationcheck # check for two durations multiplied together [fast: false, auto-fix: false]
    - errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted. [fast: false, auto-fix: false]
    - errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`. [fast: false, auto-fix: false]
    - exptostd # Detects functions from golang.org/x/exp/ that can be replaced by std functions. [auto-fix]
    - funcorder # Checks the order of functions, methods, and constructors. [fast]
    - gocheckcompilerdirectives # Checks that go compiler directive comments (//go:) are valid. [fast: true, auto-fix: false]
    - gochecksumtype # Run exhaustiveness checks on Go "sum types" [fast: false, auto-fix: false]
    - goconst # Finds repeated strings that could be replaced by a constant [fast: true, auto-fix: false]
    - gocritic # Provides diagnostics that check for bugs, performance and style issues. [fast: false, auto-fix: false]
    - gocyclo # Computes and checks the cyclomatic complexity of functions [fast: true, auto-fix: false]
    - goheader # Checks is file header matches to pattern [fast: true, auto-fix: false]
    - gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. [fast: true, auto-fix: false]
    - gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations. [fast: true, auto-fix: false]
    - goprintffuncname # Checks that printf-like functions are named with `f` at the end [fast: true, auto-fix: false]
    - govet #(vet, vetshadow): Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string [fast: false, auto-fix: false]
    - grouper # An analyzer to analyze expression groups. [fast: true, auto-fix: false]
    - importas # Enforces consistent import aliases [fast: false, auto-fix: false]
    - ineffassign # Detects when assignments to existing variables are not used [fast: true, auto-fix: false]
    - intrange # intrange is a linter to find places where for loops could make use of an integer range. [fast: true, auto-fix: false]
    - loggercheck # (logrlint): Checks key value pairs for common logger libraries (kitlog,klog,logr,zap). [fast: false, auto-fix: false]
    - makezero # Finds slice declarations with non-zero initial length [fast: false, auto-fix: false]
    - mirror # reports wrong mirror patterns of bytes/strings usage [fast: false, auto-fix: false]
    - misspell # Finds commonly misspelled English words in comments [fast: true, auto-fix: true]
    - modernize # A suite of analyzers that suggest simplifications to Go code, using modern language and library features.
    - musttag # enforce field tags in (un)marshaled structs [fast: false, auto-fix: false]
    - nakedret # Finds naked returns in functions greater than a specified function length [fast: true, auto-fix: false]
    - nilerr # Finds the code that returns nil even if it checks that the error is not nil. [fast: false, auto-fix: false]
    - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity [fast: true, auto-fix: false]
    - nolintlint # Reports ill-formed or insufficient nolint directives [fast: true, auto-fix: false]
    - nosprintfhostport # Checks for misuse of Sprintf to construct a host with port in a URL. [fast: true, auto-fix: false]
    - perfsprint # Checks that fmt.Sprintf can be replaced with a faster alternative. [fast: false, auto-fix: false]
    - prealloc # Finds slice declarations that could potentially be pre-allocated [fast: true, auto-fix: false]
    - predeclared # find code that shadows one of Go's predeclared identifiers [fast: true, auto-fix: false]
    - promlinter # Check Prometheus metrics naming via promlint [fast: true, auto-fix: false]
    - protogetter # Reports direct reads from proto message fields when getters should be used [fast: false, auto-fix: true]
    - reassign # Checks that package variables are not reassigned [fast: false, auto-fix: false]
    - revive # Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint. [fast: false, auto-fix: false]
    - rowserrcheck # checks whether Err of rows is checked successfully [fast: false, auto-fix: false]
    - sloglint # ensure consistent code style when using log/slog [fast: false, auto-fix: false]
    - tagalign # check that struct tags are well aligned [fast: true, auto-fix: true]
    - testifylint # Checks usage of github.com/stretchr/testify. [fast: false, auto-fix: false]
    - testpackage # linter that makes you use a separate _test package [fast: true, auto-fix: false]
    - thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers [fast: false, auto-fix: false]
    - tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes [fast: false, auto-fix: false]
    - unconvert # Remove unnecessary type conversions [fast: false, auto-fix: false]
    - unparam # Reports unused function parameters [fast: false, auto-fix: false]
    - unused #(megacheck): Checks Go code for unused constants, variables, functions and types [fast: false, auto-fix: false]
    - usestdlibvars # A linter that detect the possibility to use variables/constants from the Go standard library. [fast: true, auto-fix: false]
    - usetesting # Reports uses of functions with replacement inside the testing package. [auto-fix]
    - wastedassign # wastedassign finds wasted assignment statements. [fast: false, auto-fix: false]
    - whitespace # Tool for detection of leading and trailing whitespace [fast: true, auto-fix: true]
    - zerologlint # Detects the wrong usage of `zerolog` that a user forgets to dispatch with `Send` or `Msg` [fast: false, auto-fix: false]

  settings:
    goconst:
      min-len: 5
    gosec:
      excludes:
        - G115
    revive:
      rules:
        - name: exported
          disabled: true
    modernize:
      disable:
        - reflecttypefor

  exclusions:
    paths:
      - internal/pkg

    rules:
    - path: _test\.go
      linters:
        - stylecheck
        - gosec

    # Organization ID is mark as deprecated in the SDK
    # This rule ignore this deprecation
    - path: internal/namespaces/instance
      linters:
        - staticcheck
      text: "SA1019:.*(Organization)"

    # Instance Public IP is mark as deprecated in the SDK
    # This rule ignore this deprecation
    - path: internal/namespaces
      linters:
        - staticcheck
      text: "SA1019:.*PublicIP is deprecated.*"

    # Instance Public IP is mark as deprecated in the SDK
    # This rule ignore this deprecation
    - path: internal/namespaces/instance
      linters:
        - staticcheck
      text: "SA1019:.*\\.IPv6.*"

    - path: internal/tabwriter
      linters:
        - unused
        - errcheck
        - funcorder

    - path: internal/tabwriter/.*_test\.go
      linters:
        - goconst

    - path: internal/namespaces
      source: "^package .*_.*"
      linters:
        - revive
        - stylecheck

    - path: internal/namespaces/k8s/v1/types/types.go
      linters:
        - tagalign

issues:
  max-issues-per-linter: 0
  max-same-issues: 0
