---
# Reference: https://golangci-lint.run/usage/configuration/
run:
  timeout: 5m
  # modules-download-mode: vendor

  # Include test files.
  tests: true

  skip-dirs: []

  skip-files: []

output:
  # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number".
  format: colored-line-number
  print-issued-lines: true
  print-linter-name: true

# Linter specific settings. See below in the `linter.enable` section for details on what each linter is doing.
linters-settings:
  dogsled:
    # Checks assignments with too many blank identifiers. Default is 2.
    max-blank-identifiers: 2

  dupl:
    # Tokens count to trigger issue.
    threshold: 150

  errcheck:
    # Report about not checking of errors in type assertions: `a := b.(MyStruct)`.
    # Enabled as this is often overlooked by developers.
    check-type-assertions: true
    # Report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`.
    # Disabled as we consider that if the developer did type `_`, it was on purpose.
    # Note that while this isn't enforced by the linter, each and every case of ignored error should
    # be accompanied with a comment explaining why that error is being discarded.
    check-blank: false

  exhaustive:
    # Indicates that switch statements are to be considered exhaustive if a
    # 'default' case is present, even if all enum members aren't listed in the
    # switch.
    default-signifies-exhaustive: false

  funlen:
    # funlen checks the number of lines/statements in a function.
    # While is is always best to keep functions short for readability, maintainability and testing,
    # the default are a bit too strict (60 lines / 40 statements), increase it to be more flexible.
    lines: 160
    statements: 70

  # NOTE: We don't set `gci` for import order as it supports only one prefix. Use `goimports.local-prefixes` instead.

  gocognit:
    # Minimal code complexity to report, defaults to 30 in gocognit, defaults 10 in golangci.
    # Use 15 as it allows for some flexibility while preventing too much complexity.
    # NOTE: Similar to gocyclo.
    min-complexity: 35

  nestif:
    # Minimal complexity of if statements to report.
    min-complexity: 8

  goconst:
    # Minimal length of string constant.
    min-len: 4
    # Minimal occurrences count to trigger.
    # Increase the default from 3 to 5 as small number of const usage can reduce readability instead of improving it.
    min-occurrences: 5

  gocritic:
    # Which checks should be disabled; can't be combined with 'enabled-checks'.
    # See https://go-critic.github.io/overview#checks-overview
    # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint run`
    disabled-checks:
      - hugeParam  # Very strict check on the size of variables being copied. Too strict for most developer.
    # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.
    # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags".
    enabled-tags:
      - diagnostic
      - style
      - opinionated
      - performance
    settings:
      rangeValCopy:
        sizeThreshold: 1024  # Increase the allowed copied bytes in range.

  cyclop:
    max-complexity: 35

  gocyclo:
    # Similar check as gocognit.
    # NOTE: We might be able to remove this linter as it is redundant with gocyclo. It is in golangci-lint, so we keep it for now.
    min-complexity: 35

  godot:
    # Check all top-level comments, not only declarations.
    check-all: true

  gofmt:
    # simplify code: gofmt with `-s` option.
    simplify: true

  # NOTE: the goheader settings are set per-project.

  goimports:
    # Put imports beginning with prefix after 3rd-party packages.
    # It's a comma-separated list of prefixes.
    local-prefixes: "github.com/creack/pty"

  golint:
    # Minimal confidence for issues, default is 0.8.
    min-confidence: 0.8

  gosimple:
    # Select the Go version to target. The default is '1.13'.
    go: "1.18"
    # https://staticcheck.io/docs/options#checks
    checks: ["all"]

  gosec:

  govet:
    # Enable all available checks from go vet.
    enable-all: false
    # Report about shadowed variables.
    check-shadowing: true

  # NOTE: depguard is disabled as it is very slow and made redundant by gomodguard.

  lll:
    # Make sure everyone is on the same level, fix the tab width to go's default.
    tab-width: 8
    # Increase the default max line length to give more flexibility. Forcing newlines can reduce readability instead of improving it.
    line-length: 180

  misspell:
    locale: US
    ignore-words:

  nakedret:
    # Make an issue if func has more lines of code than this setting and it has naked returns; default is 30.
    # NOTE: Consider setting this to 1 to prevent naked returns.
    max-func-lines: 30

  nolintlint:
    # Prevent ununsed directive to avoid stale comments.
    allow-unused: false
    # Require an explanation of nonzero length after each nolint directive.
    require-explanation: true
    # Exclude following linters from requiring an explanation.
    # NOTE: It is strongly discouraged to put anything in there.
    allow-no-explanation: []
    # Enable to require nolint directives to mention the specific linter being suppressed. This ensurce the developer understand the reason being the error.
    require-specific: true

  prealloc:
    # NOTE: For most programs usage of prealloc will be a premature optimization.
    #       Keep thing simple, pre-alloc what is obvious and profile the program for more complex scenarios.
    #
    simple: true       # Checkonly on simple loops that have no returns/breaks/continues/gotos in them.
    range-loops: true  # Check range loops, true by default
    for-loops: false   # Check suggestions on for loops, false by default

  rowserrcheck:
    packages: []

  staticcheck:
    # Select the Go version to target. The default is '1.13'.
    go: "1.18"
    # https://staticcheck.io/docs/options#checks
    checks: ["all"]

  stylecheck:
    # Select the Go version to target. The default is '1.13'.
    go: "1.18"
    # https://staticcheck.io/docs/options#checks
    checks: ["all"]  # "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022"]

  tagliatelle:
    # Check the struck tag name case.
    case:
      # Use the struct field name to check the name of the struct tag.
      use-field-name: false
      rules:
        # Any struct tag type can be used.
        # support string case: `camel`, `pascal`, `kebab`, `snake`, `goCamel`, `goPascal`, `goKebab`, `goSnake`, `upper`, `lower`
        json: snake
        firestore: camel
        yaml: camel
        xml: camel
        bson: camel
        avro: snake
        mapstructure: kebab
        envconfig: upper

  unparam:
    # Don't create an error if an exported code have static params being used. It is often expected in libraries.
    # NOTE: It would be nice if this linter would differentiate between a main package and a lib.
    check-exported: true

  unused: {}

  whitespace:
    multi-if: false    # Enforces newlines (or comments) after every multi-line if statement
    multi-func: false  # Enforces newlines (or comments) after every multi-line function signature

# Run `golangci-lint help linters` to get the full list of linter with their description.
linters:
  disable-all: true
  # NOTE: enable-all is deprecated because too  many people don't pin versions...
  # We still require explicit documentation on why some linters are disabled.
  # disable:
  #   - depguard          # Go linter that checks if package imports are in a list of acceptable packages [fast: true, auto-fix: false]
  #   - exhaustivestruct  # Checks if all struct's fields are initialized [fast: true, auto-fix: false]
  #   - forbidigo         # Forbids identifiers [fast: true, auto-fix: false]
  #   - gci               # Gci control golang package import order and make it always deterministic. [fast: true, auto-fix: true]
  #   - godox             # Tool for detection of FIXME, TODO and other comment keywords [fast: true, auto-fix: false]
  #   - goerr113          # Golang linter to check the errors handling expressions [fast: true, auto-fix: false]
  #   - golint            # Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes [fast: false, auto-fix: false]
  #   - gomnd             # An analyzer to detect magic numbers. [fast: true, auto-fix: false]
  #   - gomoddirectives   # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. [fast: true, auto-fix: false]
  #   - interfacer        # Linter that suggests narrower interface types [fast: false, auto-fix: false]
  #   - maligned          # Tool to detect Go structs that would take less memory if their fields were sorted [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]
  #   - scopelint         # Scopelint checks for unpinned variables in go programs [fast: true, auto-fix: false]
  #   - wrapcheck         # Checks that errors returned from external packages are wrapped [fast: false, auto-fix: false]
  #   - wsl               # Whitespace Linter - Forces you to use empty lines! [fast: true, auto-fix: false]

  # disable-reasons:
  #   - depguard          # Checks whitelisted/blacklisted import path, but runs way too slow. Not that useful.
  #   - exhaustivestruct  # Good concept, but not mature enough (errors on not assignable fields like locks) and too noisy when using AWS SDK as most fields are unused.
  #   - forbidigo         # Great idea, but too strict out of the box. Probably will re-enable soon.
  #   - gci               # Conflicts with goimports/gofumpt.
  #   - godox             # Don't fail when finding TODO, FIXME, etc.
  #   - goerr113          # Too many false positives.
  #   - golint            # Deprecated (since v1.41.0) due to: The repository of the linter has been archived by the owner.  Replaced by revive.
  #   - gomnd             # Checks for magic numbers. Disabled due to too many false positives not configurable (03/01/2020 v1.23.7).
  #   - gomoddirectives   # Doesn't support //nolint to whitelist.
  #   - interfacer        # Deprecated (since v1.38.0) due to: The repository of the linter has been archived by the owner.
  #   - maligned          # Deprecated (since v1.38.0) due to: The repository of the linter has been archived by the owner.  Replaced by govet 'fieldalignment'.
  #   - nlreturn          # Actually reduces readability in most cases.
  #   - scopelint         # Deprecated (since v1.39.0) due to: The repository of the linter has been deprecated by the owner.  Replaced by exportloopref.
  #   - wrapcheck         # Good concept, but always warns for http coded errors. Need to re-enable and whitelist our error package.
  #   - wsl               # Forces to add newlines around blocks. Lots of false positives, not that useful.

  enable:
    - asciicheck        # Simple linter to check that your code does not contain non-ASCII identifiers [fast: true, auto-fix: false]
    - bodyclose         # checks whether HTTP response body is closed successfully [fast: false, auto-fix: false]
    - cyclop            # checks function and package cyclomatic complexity [fast: false, auto-fix: false]
    - dogsled           # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) [fast: true, auto-fix: false]
    - dupl              # Tool for code clone detection [fast: true, auto-fix: false]
    - durationcheck     # check for two durations multiplied together [fast: false, auto-fix: false]
    - errcheck          # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases [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]
    - errorlint         # go-errorlint is a source code linter for Go software that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. [fast: false, auto-fix: false]
    - exhaustive        # check exhaustiveness of enum switch statements [fast: false, auto-fix: false]
    - exportloopref     # checks for pointers to enclosing loop variables [fast: false, auto-fix: false]
    - forcetypeassert   # finds forced type assertions [fast: true, auto-fix: false]
    - funlen            # Tool for detection of long functions [fast: true, auto-fix: false]
    - gochecknoglobals  # check that no global variables exist [fast: true, auto-fix: false]
    - gochecknoinits    # Checks that no init functions are present in Go code [fast: true, auto-fix: false]
    - gocognit          # Computes and checks the cognitive complexity of functions [fast: true, auto-fix: false]
    - goconst           # Finds repeated strings that could be replaced by a constant [fast: true, auto-fix: false]
    - gocritic          # Provides many 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]
    - godot             # Check if comments end in a period [fast: true, auto-fix: true]
    - 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]
    - goheader          # Checks is file header matches to pattern [fast: true, auto-fix: false]
    - goimports         # Goimports does everything that gofmt does. Additionally it checks unused imports [fast: true, auto-fix: true]
    - 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]
    - gosec             # (gas): Inspects source code for security problems [fast: false, auto-fix: false]
    - gosimple          # (megacheck): Linter for Go source code that specializes in simplifying a code [fast: false, 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]
    - 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]
    - lll               # Reports long lines [fast: true, auto-fix: false]
    - makezero          # Finds slice declarations with non-zero initial length [fast: false, auto-fix: false]
    - misspell          # Finds commonly misspelled English words in comments [fast: true, auto-fix: true]
    - nakedret          # Finds naked returns in functions greater than a specified function length [fast: true, auto-fix: false]
    - nestif            # Reports deeply nested if statements [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]
    - noctx             # noctx finds sending http request without context.Context [fast: false, auto-fix: false]
    - nolintlint        # Reports ill-formed or insufficient nolint directives [fast: true, auto-fix: false]
    - paralleltest      # paralleltest detects missing usage of t.Parallel() method in your Go test [fast: true, auto-fix: false]
    - prealloc          # Finds slice declarations that could potentially be preallocated [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]
    - revive            # Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint. [fast: false, auto-fix: false]
    # Disabled due to generic. Work in progress upstream.
    # - rowserrcheck      # checks whether Err of rows is checked successfully [fast: false, auto-fix: false]
    # Disabled due to generic. Work in progress upstream.
    # - sqlclosecheck     # Checks that sql.Rows and sql.Stmt are closed. [fast: false, auto-fix: false]
    - staticcheck       # (megacheck): Staticcheck is a go vet on steroids, applying a ton of static analysis checks [fast: false, auto-fix: false]
    - stylecheck        # Stylecheck is a replacement for golint [fast: false, auto-fix: false]
    # Disabled due to generic. Work in progress upstream.
    # - tagliatelle       # Checks the struct tags. [fast: true, 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]
    - typecheck         # Like the front-end of a Go compiler, parses and type-checks Go code [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]
    # Disabled due to way too many false positive in go1.20.
    # - unused            # (megacheck): Checks Go code for unused constants, variables, functions and types [fast: false, auto-fix: false]
    # Disabled due to generic. Work in progress upstream.
    # - 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]

issues:
  exclude:
    # Allow shadowing of 'err'.
    - 'shadow: declaration of "err" shadows declaration'
    # Allow shadowing of `ctx`.
    - 'shadow: declaration of "ctx" shadows declaration'
  # Maximum issues count per one linter. Set to 0 to disable. Default is 50.
  max-per-linter: 10
  # Disable default excludes. Always be explicit on what we exclude.
  exclude-use-default: false
  # Exclude some linters from running on tests files.
  exclude-rules: []
