# SPDX-FileCopyrightText: 2026 The Pion community <https://pion.ly>
# SPDX-License-Identifier: MIT

version: "2"
linters:
  enable:
    - asciicheck       # Simple linter to check that your code does not contain non-ASCII identifiers
    - bidichk          # Checks for dangerous unicode character sequences
    - bodyclose        # checks whether HTTP response body is closed successfully
    - containedctx     # containedctx is a linter that detects struct contained context.Context field
    - contextcheck     # check the function whether use a non-inherited context
    - cyclop           # checks function and package cyclomatic complexity
    - decorder         # check declaration order and count of types, constants, variables and functions
    - dogsled          # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f())
    - dupl             # Tool for code clone detection
    - durationcheck    # check for two durations multiplied together
    - err113           # Golang linter to check the errors handling expressions
    - errcheck         # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases
    - errchkjson       # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occations, where the check for the returned error can be omitted.
    - errname          # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`.
    - errorlint        # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13.
    - exhaustive       # check exhaustiveness of enum switch statements
    - forbidigo        # Forbids identifiers
    - forcetypeassert  # finds forced type assertions
    - gochecknoglobals # Checks that no globals are present in Go code
    - gocognit         # Computes and checks the cognitive complexity of functions
    - goconst          # Finds repeated strings that could be replaced by a constant
    - gocritic         # The most opinionated Go source code linter
    - gocyclo          # Computes and checks the cyclomatic complexity of functions
    - godot            # Check if comments end in a period
    - godox            # Tool for detection of FIXME, TODO and other comment keywords
    - goheader         # Checks is file header matches to pattern
    - gomoddirectives  # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod.
    - goprintffuncname # Checks that printf-like functions are named with `f` at the end
    - gosec            # Inspects source code for security problems
    - govet            # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
    - grouper          # An analyzer to analyze expression groups.
    - importas         # Enforces consistent import aliases
    - ineffassign      # Detects when assignments to existing variables are not used
    - lll              # Reports long lines
    - maintidx         # maintidx measures the maintainability index of each function.
    - makezero         # Finds slice declarations with non-zero initial length
    - misspell         # Finds commonly misspelled English words in comments
    - modernize        # Replace and suggests simplifications to code
    - nakedret         # Finds naked returns in functions greater than a specified function length
    - nestif           # Reports deeply nested if statements
    - nilerr           # Finds the code that returns nil even if it checks that the error is not nil.
    - nilnil           # Checks that there is no simultaneous return of `nil` error and an invalid value.
    - nlreturn         # nlreturn checks for a new line before return and branch statements to increase code clarity
    - noctx            # noctx finds sending http request without context.Context
    - predeclared      # find code that shadows one of Go's predeclared identifiers
    - revive           # golint replacement, finds style mistakes
    - staticcheck      # Staticcheck is a go vet on steroids, applying a ton of static analysis checks
    - tagliatelle      # Checks the struct tags.
    - thelper          # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers
    - unconvert        # Remove unnecessary type conversions
    - unparam          # Reports unused function parameters
    - unused           # Checks Go code for unused constants, variables, functions and types
    - varnamelen       # checks that the length of a variable's name matches its scope
    - wastedassign     # wastedassign finds wasted assignment statements
    - whitespace       # Tool for detection of leading and trailing whitespace
  disable:
    - depguard         # Go linter that checks if package imports are in a list of acceptable packages
    - funlen           # Tool for detection of long functions
    - gochecknoinits   # Checks that no init functions are present in Go code
    - 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.
    - interfacebloat   # A linter that checks length of interface.
    - ireturn          # Accept Interfaces, Return Concrete Types
    - mnd              # An analyzer to detect magic numbers
    - nolintlint       # Reports ill-formed or insufficient nolint directives
    - paralleltest     # paralleltest detects missing usage of t.Parallel() method in your Go test
    - prealloc         # Finds slice declarations that could potentially be preallocated
    - promlinter       # Check Prometheus metrics naming via promlint
    - rowserrcheck     # checks whether Err of rows is checked successfully
    - sqlclosecheck    # Checks that sql.Rows and sql.Stmt are closed.
    - testpackage      # linter that makes you use a separate _test package
    - tparallel        # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes
    - wrapcheck        # Checks that errors returned from external packages are wrapped
    - wsl              # Whitespace Linter - Forces you to use empty lines!
  settings:
    staticcheck:
      checks:
        - all
        - -QF1008 # "could remove embedded field", to keep it explicit!
        - -QF1003 # "could use tagged switch on enum", Cases conflicts with exhaustive!
    exhaustive:
      default-signifies-exhaustive: true
    forbidigo:
      forbid:
        - pattern: ^fmt.Print(f|ln)?$
        - pattern: ^log.(Panic|Fatal|Print)(f|ln)?$
        - pattern: ^os.Exit$
        - pattern: ^panic$
        - pattern: ^print(ln)?$
        - pattern: ^testing.T.(Error|Errorf|Fatal|Fatalf|Fail|FailNow)$
          pkg: ^testing$
          msg: use testify/assert instead
      analyze-types: true
    gomodguard:
      blocked:
        modules:
          - github.com/pkg/errors:
              recommendations:
                - errors
    govet:
      enable:
        - shadow
    revive:
      rules:
        # Prefer 'any' type alias over 'interface{}' for Go 1.18+ compatibility
        - name: use-any
          severity: warning
          disabled: false
        # Keep package documentation consistent and avoid duplicate package comments.
        - name: package-comments
          severity: warning
          disabled: false
    misspell:
      locale: US
    varnamelen:
      max-distance: 12
      min-name-length: 2
      ignore-type-assert-ok: true
      ignore-map-index-ok: true
      ignore-chan-recv-ok: true
      ignore-decls:
        - i int
        - n int
        - w io.Writer
        - r io.Reader
        - b []byte
  exclusions:
    generated: lax
    rules:
      - linters:
          - forbidigo
          - gocognit
        path: (examples|main\.go)
      - linters:
          - gocognit
        path: _test\.go
      - linters:
          - forbidigo
        path: cmd
formatters:
  enable:
    - gci              # Gci control golang package import order and make it always deterministic.
    - gofmt            # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification
    - gofumpt          # Gofumpt checks whether code was gofumpt-ed.
    - goimports        # Goimports does everything that gofmt does. Additionally it checks unused imports
  exclusions:
    generated: lax
issues:
  max-issues-per-linter: 0
  max-same-issues: 0
