---
linters:
  enable:
    # Prevents against memory leaks in production caused by not closing
    # file handle
    - bodyclose
    # Detects cloned code. DRY is good programming practice. Can cause issues
    # with testing code where simplicity is preferred over duplication.
    # Disabled for test code.
    # - dupl
    # Detects unchecked errors in go programs. These unchecked errors can be
    # critical bugs in some cases.
    - errcheck
    # Simplifies go code.
    - gosimple
    # Controls Go package import order and makes it always deterministic.
    - gci
    # Reports suspicious constructs, maintained by goteam. e.g. Printf unused
    # params not caught at compile time.
    - govet
    # Detect security issues with gocode. Use of secrets in code or obsolete
    # security algorithms. It's imaged heuristic methods are used in finding
    # problems. If issues with rules are found particular rules can be disabled
    # as required. Could possibility cause issues with testing.
    # Disabled for test code.
    - gosec
    # Detect repeated strings that could be replaced by a constant
    - goconst
    # Misc linters missing from other projects. Grouped into 3 categories
    # diagnostics, style and performance
    - gocritic
    # Limits code cyclomatic complexity
    - gocyclo
    # Detects if code needs to be gofmt'd
    - gofmt
    # Detects unused go package imports
    - goimports
    # Detects style mistakes not correctness. Golint is meant to carry out the
    # stylistic conventions put forth in Effective Go and CodeReviewComments.
    # golint has false positives and false negatives and can be tweaked.
    - revive
    # Detects ineffectual assignments in code
    - ineffassign
    # Reports long lines
    # - lll
    # Detect commonly misspelled english words in comments
    - misspell
    # Detect naked returns on non-trivial functions, and conform with
    # Go CodeReviewComments
    - nakedret
    # Detect slice allocations that can be preallocated
    - prealloc
    # Misc collection of static analysis tools
    - staticcheck
    # Detects unused struct fields
    # - structcheck
    # Parses and typechecks the code like the go compiler
    - typecheck
    # Detects unused constants, variables, functions and types
    - unused
    # Remove unnecessary type conversions
    - unconvert
    # Remove unnecessary(unused) function parameters
    - unparam
linters-settings:
  errcheck:
    exclude-functions:
      - fmt.Fprint
      - fmt.Fprintf
  gci:
    sections:
      - standard            # Standard section: captures all standard packages.
      - localmodule         # Local module section: contains all local packages.
      # - prefix(gogs.jc21.com)  # Prefixed gerrit.lan packages (jumgo).
      - default             # Everything else (github.com, golang.org, etc).
      - blank               # Blank section: contains all blank imports.
    custom-order: true
  goconst:
    # minimal length of string constant
    # default: 3
    min-len: 2
    # minimum number of occurrences of string constant
    # default: 3
    min-occurences: 2
  revive:
    enable-all-rules: true
    rules:
      - name: unchecked-type-assertion
        disabled: true
      # handled by goconst
      - name: add-constant
        disabled: true
      # cant limit this arbitrarily
      - name: argument-limit
        disabled: true
      # handled by gocyclo
      - name: cognitive-complexity
        disabled: true
      # false positive for Exported vs non-exported functions of the same name
      - name: confusing-naming
        disabled: true
      # false positives for "" - which is the nil value of a string (also 0)
      - name: confusing-results
        disabled: true
      # handled by gocyclo
      - name: cyclomatic
        disabled: true
      # have comments on exported functions but not on vars/types/constants
      - name: exported
        arguments:
          - "disableChecksOnConstants"
          - "disableChecksOnTypes"
          - "disableChecksOnVariables"
      # false positives on bool params
      - name: flag-parameter
        disabled: true
      # extreme verticalization can happen
      - name: function-length
        disabled: true
      # can false positive for non-getters
      - name: get-return
        disabled: true
      # only allows lowercase names
      - name: import-alias-naming
        disabled: true
      # handled by lll
      - name: line-length-limit
        disabled: true
      # don't want to arbitrarily limit this
      # many places have specific model.go files to contain all structs
      - name: max-public-structs
        disabled: true
      # disable package-comments
      - name: package-comments
        disabled: true
      # this is handled by errcheck
      - name: unhandled-error
        disabled: true
      - name: function-result-limit
        disabled: true
issues:
  # Maximum count of issues with the same text. Set to 0 to disable. Default
  # is 3. We have chosen an arbitrary value that works based on practical usage.
  max-same: 20
  # See cmdline flag documentation for more info about default excludes
  # --exclude-use-default. Nothing is excluded by default
  exclude-use-default: false
  # Excluding configuration per-path, per-linter, per-text and per-source
  exclude-rules:
    # Exclude some linters from running on tests files.
    # TODO: Add examples why this is good
    - path: _test\.go
      linters:
        # Tests should be simple? Add example why this is good?
        - gocyclo
        # Error checking adds verbosity and complexity for minimal value
        - errcheck
        # Table test encourage duplication in defining the table tests.
        - dupl
        # Hard coded example tokens, SQL injection and other bad practices may
        # want to be tested
        - gosec
        # Test data can long
        # - lll
run:
  go: '1.23'
