---
run:
  timeout: 10m
  skip-dirs:

issues:
  exclude-use-default: false
  exclude-dirs:
    - pkg/mime
    - extern
  exclude:
    - Using the variable on range scope `tt` in function literal
    # For now we are missing a lot of comments.
    - should have comment (\([^)]+\) )?or be unexported
    # For now we are missing a lot of comments.
    - at least one file in a package should have a package comment
    # Package comments.
    - "package-comments: should have a package comment"
    # Migration uses underscores to make versions clearer.
    - "var-naming: don't use underscores in Go names"
    - "ST1003: should not use underscores in Go names"

  exclude-rules:
    - path: _test\.go
      linters:
        - dupl
        - gochecknoglobals
        - gochecknoinits
        - gosec
        - goconst
        - dogsled
    - path: test
      linters:
        - dupl
        - gochecknoglobals
        - gochecknoinits
        - gosec
        - goconst
        - dogsled
    - path: utils/smtp-send
      linters:
        - dupl
        - gochecknoglobals
        - gochecknoinits
        - gosec
        - goconst
        - dogsled

linters-settings:
  godox:
    keywords:
      - TODO
      - FIXME

linters:
  # setting disable-all will make only explicitly enabled linters run
  disable-all: true

  enable:
    - errcheck          # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases [fast: true, auto-fix: false]
    - gosimple          # Linter for Go source code that specializes in simplifying a code [fast: true, auto-fix: false]
    - govet             # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string [fast: true, auto-fix: false]
    - ineffassign       # Detects when assignments to existing variables are not used [fast: true, auto-fix: false]
    - staticcheck       # Staticcheck is a go vet on steroids, applying a ton of static analysis checks [fast: true, auto-fix: false]
    - typecheck         # Like the front-end of a Go compiler, parses and type-checks Go code [fast: true, auto-fix: false]
    - unused            # Checks Go code for unused constants, variables, functions and types [fast: false, auto-fix: false]
    - bodyclose         # checks whether HTTP response body is closed successfully [fast: true, auto-fix: false]
    #- depguard          # Go linter that checks if package imports are in a list of acceptable packages [fast: true, 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]
    - gochecknoglobals  # Checks that no globals are present in Go code [fast: true, auto-fix: false]
    - gochecknoinits    # Checks that no init functions are present in Go code [fast: true, auto-fix: false]
    - goconst           # Finds repeated strings that could be replaced by a constant [fast: true, auto-fix: false]
    - gocritic          # The most opinionated Go source code linter [fast: true, auto-fix: false]
    - gocyclo           # Computes and checks the cyclomatic complexity of functions [fast: true, auto-fix: false]
    - godox             # Tool for detection of FIXME, TODO and other comment keywords [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]
    - goimports         # Goimports does everything that gofmt does. Additionally it checks unused imports [fast: true, auto-fix: true]
    - gosec             # Inspects source code for security problems [fast: true, 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]
    - prealloc          # Finds slice declarations that could potentially be preallocated [fast: true, auto-fix: false]
    - stylecheck        # Stylecheck is a replacement for golint [fast: true, auto-fix: false]
    - unconvert         # Remove unnecessary type conversions [fast: true, auto-fix: false]
    - unparam           # Reports unused function parameters [fast: true, auto-fix: false]
    - whitespace        # Tool for detection of leading and trailing whitespace [fast: true, auto-fix: true]
    - asciicheck        # Simple linter to check that your code does not contain non-ASCII identifiers [fast: true, auto-fix: false]
    - durationcheck     # check for two durations multiplied together [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]
    - copyloopvar       # detects places where loop variables are copied.
    - forcetypeassert   # finds forced type assertions [fast: true, auto-fix: false]
    - godot             # Check if comments end in a period [fast: true, auto-fix: true]
    - goheader          # Checks is file header matches to pattern [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]
    - importas          # Enforces consistent import aliases [fast: false, auto-fix: false]
    - makezero          # Finds slice declarations with non-zero initial length [fast: false, 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]
    - predeclared       # find code that shadows one of Go's predeclared identifiers [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]
    - rowserrcheck      # checks whether Err of rows is checked successfully [fast: false, auto-fix: false]
    - sqlclosecheck     # Checks that sql.Rows and sql.Stmt are closed. [fast: false, auto-fix: false]
    - tparallel         # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes [fast: false, auto-fix: false]
    - wastedassign      # wastedassign finds wasted assignment statements. [fast: false, auto-fix: false]
    # - wsl               # Whitespace Linter - Forces you to use empty lines! [fast: true, auto-fix: false]
    # - lll               # Reports long lines [fast: true, auto-fix: false]
    # Consider to include:
    # - gocognit          # Computes and checks the cognitive complexity of functions [fast: true, auto-fix: false]
    # - cyclop            # checks function and package cyclomatic complexity [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]
    # - exhaustivestruct  # Checks if all struct's fields are initialized [fast: false, 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]
    # - gocognit          # Computes and checks the cognitive complexity of functions [fast: true, auto-fix: false]
    # - goerr113          # Golang linter to check the errors handling expressions [fast: false, auto-fix: false]
    # - gofumpt           # Gofumpt checks whether code was gofumpt-ed. [fast: true, auto-fix: true]
    # - 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]
    # - ifshort           # Checks that your code uses short syntax for if-statements whenever possible [fast: true, auto-fix: false]
    # - nestif            # Reports deeply nested if statements [fast: true, auto-fix: false]
    # - nlreturn          # nlreturn checks for a new line before return and branch statements to increase code clarity [fast: true, 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]
    # - 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]
    # - wrapcheck         # Checks that errors returned from external packages are wrapped [fast: false, auto-fix: false]

    # Deprecated:
    # - structcheck       # Finds unused struct fields [fast: true, auto-fix: false] deprecated (since v1.49.0) due to: The owner seems to have abandoned the linter. Replaced by unused.
    # - deadcode          # Finds unused code [fast: true, auto-fix: false] deprecated (since v1.49.0) due to: The owner seems to have abandoned the linter. Replaced by unused.
    # - varcheck          # Finds unused global variables and constants [fast: true, auto-fix: false] deprecated (since v1.49.0) due to: The owner seems to have abandoned the linter. Replaced by unused.
