run:
    tests: true
    skip-dirs:
        - contracts/wasm

issues:
    exclude-use-default: false
    # Maximum issues count per one linter.
    # Set to 0 to disable.
    # Default: 50
    max-issues-per-linter: 0
    # Maximum count of issues with the same text.
    # Set to 0 to disable.
    # Default: 3
    max-same-issues: 0
    new-from-rev: ""
    exclude:
        - 'Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv). is not checked' # errcheck
        - "err113: do not define dynamic errors, use wrapped static errors instead:" # goerr113
        - "type name will be used as [0-9A-Za-z_.]+ by other packages, and that stutters; consider calling this" # golint
        - "Potential file inclusion via variable" # gosec
        - "G404: Use of weak random number generator" # gosec
        - "Subprocess launch(ed with variable|ing should be audited)" # gosec
        - "Use of unsafe calls should be audited" # gosec
        - "G108: Profiling endpoint is automatically exposed on /debug/pprof" # gosec
        - "(Expect directory permissions to be 0750 or less|Expect file permissions to be 0600 or less)" # gosec
        - "G101: Potential hardcoded credentials" # gosec
        - "(G104|G307)" # gosec Duplicated errcheck checks.
        - "`[0-9A-Za-z_.]+` - `[0-9A-Za-z_.]+` always receives `[0-9A-Za-z_.]+`" # unparam
        - "should have comment .*or be unexported" # revive
        - "exported: comment on exported" # revive
        - "package-comments" # revive
        - "blank-imports" # revive
        - "var-naming: don't use leading k in Go names;" #revive
        - 'shadow: declaration of "err"' # govet

    exclude-rules:
        - path: (_test\.go|example_test\.go|example_[0-9A-Za-z_-]+_test\.go)
          linters:
              - errcheck
              - bodyclose
              - noctx
              - gosec
              - funlen
              - gomnd
        - path: (_test\.go|example_test\.go|example_[0-9A-Za-z_-]+_test\.go)
          linters:
              - gocritic
          text: "unnecessaryBlock: block doesn't have definitions, can be simply deleted"

linters-settings:
    funlen:
        lines: 100
        statements: 50
    gocritic:
        enabled-tags:
            - diagnostic
            - style
            - opinionated
        disabled-checks:
            - commentedOutCode
            - ifElseChain
            - commentFormatting
            - dupImport
            - unnamedResult
            - octalLiteral
            - whyNoLint
            - wrapperFunc
    gomnd:
        settings:
            mnd:
                # don't include the "operation" and "assign"
                checks: [argument, case, condition, return]
    govet:
        check-shadowing: true
    misspell:
        locale: US
    nolintlint:
        allow-unused: false # report any unused nolint directives
    goimports:
        local-prefixes: github.com/iotaledger
    golint:
        min-confidence: 0.9
    gocyclo:
        min-complexity: 15
    staticcheck:
        checks: ["all"]
    stylecheck:
        initialisms:
            [
                "ACL",
                "API",
                "ASCII",
                "CPU",
                "CSS",
                "DNS",
                "EOF",
                "GUID",
                "HTML",
                "HTTP",
                "HTTPS",
                "ID",
                "IP",
                "JSON",
                "QPS",
                "RAM",
                "RPC",
                "SLA",
                "SMTP",
                "SQL",
                "SSH",
                "TCP",
                "TLS",
                "TTL",
                "UDP",
                "UI",
                "GID",
                "UID",
                "UUID",
                "URI",
                "URL",
                "UTF8",
                "VM",
                "XML",
                "XMPP",
                "XSRF",
                "XSS",
                "SIP",
                "RTP",
                "AMQP",
                "DB",
                "TS",
            ]

linters:
    disable-all: true
    enable:
        - bodyclose # Checks whether HTTP response body is closed successfully.
        - dogsled # Checks assignments with too many blank identifiers (e.g. x, , , _, := f()).
        - dupl # Tool for code clone detection.
        - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases
        - exportloopref # Checks for pointers to enclosing loop variables.
        - funlen # Tool for detection of long functions.
        - goconst # Finds repeated strings that could be replaced by a constant.
        - gocritic # Provides many diagnostics that check for bugs, performance and style issues.
        - gocyclo # Computes and checks the cyclomatic complexity of functions.
        - goerr113 # Golang linter to check the errors handling expressions.
        - 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. A more strict version of gofmt.
        - goimports # Sorts and format imports.
        - revive # revive is the newer replacement for golint
        - goprintffuncname # Checks that printf-like functions are named with f at the end.
        - gosec # Inspects source code for security problems.
        - gosimple # Linter for Go source code that specializes in simplifying a code.
        - govet # Vet examines Go source code and reports suspicious constructs.
        - ineffassign # Detects when assignments to existing variables are not used.
        - misspell # Finds commonly misspelled English words in comments.
        - nakedret # Finds naked returns in functions greater than a specified function length.
        - noctx # noctx finds sending http request without context.Context.
        - nolintlint # Reports ill-formed or insufficient nolint directives.
        - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks.
        - unconvert # Remove unnecessary type conversions.
        - unparam # Reports unused function parameters.
        - unused # Checks Go code for unused constants, variables, functions and types.
        - whitespace # Tool for detection of leading and trailing whitespace.
        - asasalint # check for pass []any as any in variadic func(...any)
        - 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
        - contextcheck # check the function whether use a non-inherited context
        - decorder # check declaration order and count of types, constants, variables and functions
        - depguard # Go linter that checks if package imports are in a list of acceptable packages [fast: true, auto-fix: false]
        - execinquery # execinquery is a linter about query string checker in Query function which reads your Go src files and warning it finds
        - 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]
        - grouper # An analyzer to analyze expression groups.
        - importas # Enforces consistent import aliases [fast: true, auto-fix: false]
        - predeclared # find code that shadows one of Go's predeclared identifiers [fast: true, auto-fix: false]
        - rowserrcheck # checks whether Err of rows is checked successfully [fast: true, auto-fix: false]
        - sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed. [fast: true, auto-fix: false]
        - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17
        - tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes [fast: true, auto-fix: false]
        - usestdlibvars # A linter that detect the possibility to use variables/constants from the Go standard library.
        - wastedassign # wastedassign finds wasted assignment 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]
    # don't enable:
    # gomnd: An analyzer to detect magic numbers.
    # cyclop: checks function and package cyclomatic complexity [fast: true, auto-fix: false]
    # durationcheck: check for two durations multiplied together [fast: true, auto-fix: false]
    # errorlint: go-errorlint is a source code linter for Go software that can be used to find code that will cause problemswith the error wrapping scheme introduced in Go 1.13. [fast: true, auto-fix: false]
    # exhaustive: check exhaustiveness of enum switch statements [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]
    # forcetypeassert: finds forced type assertions [fast: true, auto-fix: false]
    # gci: Gci control golang package import order and make it always deterministic. [fast: true, auto-fix: true]
    # 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]
    # godot: Check if comments end in a period [fast: true, auto-fix: true]
    # 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]
    # ifshort: Checks that your code uses short syntax for if-statements whenever possible [fast: true, auto-fix: false]
    # interfacer: Linter that suggests narrower interface types [fast: true, auto-fix: false]
    # lll: Reports long lines [fast: true, auto-fix: false]
    # makezero: Finds slice declarations with non-zero initial length [fast: true, auto-fix: false]
    # maligned: Tool to detect Go structs that would take less memory if their fields were sorted [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: 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]
    # scopelint: Scopelint checks for unpinned variables in go programs [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: true, auto-fix: false]
    # typecheck: Like the front-end of a Go compiler, parses and type-checks Go code [fast: true, auto-fix: false]
    # wrapcheck: Checks that errors returned from external packages are wrapped [fast: true, auto-fix: false]
    # wsl: Whitespace Linter - Forces you to use empty lines! [fast: true, auto-fix: false]
