diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..c16c4b1 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,420 @@ +# Kudos to Oleg Kovalov https://olegk.dev/go-linters-configuration-the-right-version + +run: + # Depends on your hardware + concurrency: 1 + + timeout: 30m + + # Fail if the error was met. + issues-exit-code: 1 + + # Check for bugs in tests. + tests: false + + skip-dirs: + - (^|/)vendor($|/) + + skip-files: + - .*_test.go + + # When enabled linter will skip directories: vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + skip-dirs-use-default: false + + # With the read-only mode linter will fail if the go.mod file is outdated. + modules-download-mode: readonly + + # Never ran 2 golangci-lint at once. + allow-parallel-runners: false + + # Keep this empty to use the Go version from the go.mod file. + go: "" + +linters: + # Set to true runs only fast linters. + # Good option for 'lint on save', pre-commit hook or CI. + fast: false + + enable: + # Check for pass []any as any in variadic func(...any). + # Rare case but saved me from debugging a few times. + - asasalint + + # I prefer plane ASCII identifiers. + # Symbol `∆` instead of `delta` looks cool but no, thanks. + - asciicheck + + # Checks for dangerous unicode character sequences. + # Super rare but why not to be a bit paranoid? + - bidichk + + # Checks whether HTTP response body is closed successfully. + - bodyclose + + # Check whether the function uses a non-inherited context. + - contextcheck + + # Check for two durations multiplied together. + - durationcheck + + # Forces to not skip error check. + - errcheck + + # Checks `Err-` prefix for var and `-Error` suffix for error type. + - errname + + # Suggests to use `%w` for error-wrapping. + - errorlint + + # Checks for pointers to enclosing loop variables. + - exportloopref + + # Finds forced type assertions. + - forcetypeassert + + # Imports order. + - gci + + # Almost 100 diagnostics that check for bugs, performance and style issues + # Highly extensible Go source code linter providing checks currently missing from other linters. + - gocritic + + # Forces to put `.` at the end of the comment. + - godot + + # Might not be that important, but I prefer to keep all of them. + # `gofumpt` is amazing, kudos to Daniel Marti https://github.com/mvdan/gofumpt + - gofmt + - gofumpt + - goimports + + # Reports magic consts. Might be noisy but still good. + - gomnd + + # Allow or ban replace directives in go.mod + # or force explanation for retract directives. + - gomoddirectives + + # Allowed/blocked packages to import. + - gomodguard + + # Powerful security-oriented linter. But requires some time to + # configure it properly, see https://github.com/securego/gosec#available-rules + - gosec + + # Linter that specializes in simplifying code. + - gosimple + + # Official Go tool. Must have. + - govet + + # Groupt declarations. + - grouper + + # Detects when assignments to existing variables are not used. + - ineffassign + + # Even with deprecation notice I find it useful. + # There are situations when instead of io.ReaderCloser + # I can use io.Reader. A small but good improvement. + - interfacer + + # Some log checkers, might be useful. + - loggercheck + + # Fix all the misspellings, amazing thing. + - misspell + + # Finds naked/bare returns and requires change them. + - nakedret + + # Both require a bit more explicit returns. + - nilerr + - nilnil + + # Forces newlines in some places. + - nlreturn + + # Finds sending HTTP request without context.Context. + - noctx + + # Forces comment why another check is disabled. + # Better not to have //nolint: at all ;) + - nolintlint + + # Finds slices that could potentially be pre-allocated. + # Small performance win + cleaner code. + - prealloc + + # Finds shadowing of Go's predeclared identifiers. + - predeclared + + # Lint your Prometheus metrics name. + - promlinter + + # Checks that package variables are not reassigned. + # Super rare case but can catch bad things (like `io.EOF = nil`) + - reassign + + # Drop-in replacement of `golint`. + - revive + + # Somewhat similar to `bodyclose` but for `database/sql` package. + - rowserrcheck + - sqlclosecheck + + # I have found that it's not the same as staticcheck binary :\ + - staticcheck + + # Is a replacement for `golint`, similar to `revive`. + - stylecheck + + # Check struct tags. + - tagliatelle + + # Test-related checks. All of them are good. + - tenv + - testableexamples + - thelper + - tparallel + + # Remove unnecessary type conversions, make code cleaner + - unconvert + + # Might be noisy but better to know what is unused + - unparam + + # Must have. Finds unused declarations. + - unused + + # Detect the possibility to use variables/constants from stdlib. + - usestdlibvars + + # Finds wasted assignment statements. + - wastedassign + + disable: + # Detects struct contained context.Context field. Not a problem. + - containedctx + + # Checks function and package cyclomatic complexity. + # I can have a long but trivial switch-case. + # + # Cyclomatic complexity is a measurement, not a goal. + # (c) Bryan C. Mills / https://github.com/bcmills + - cyclop + + # Deprecated, replaced by `unused`. + - deadcode + + # Check declaration order of types, consts, vars and funcs. + - decorder + + # Checks if package imports are in a list of acceptable packages. + - depguard + + # Checks assignments with too many blank identifiers. Very rare. + - dogsled + + # Tool for code clone detection. + - dupl + + # Find duplicate words, rare. + - dupword + + # I'm fine to check the error from json.Marshal + - errchkjson + + # All SQL queries MUST BE covered with tests. + - execinquery + + # Forces to handle more cases. Cool but noisy. + - exhaustive + - exhaustivestruct # Deprecated, replaced by check below. + - exhaustruct + + # Forbids some identifiers. I don't have a case for it. + - forbidigo + + # I might have long but a simple function. + - funlen + + # Globals and init() are ok. + - gochecknoglobals + - gochecknoinits + + # Same as `cyclop` linter (see above) + - gocognit + - goconst + - gocyclo + + # TODO and friends are ok. + - godox + + # Check the error handling expressions. Too noisy. + - goerr113 + + # I don't use file headers. + - goheader + + # 1st Go linter, deprecated :( use `revive`. + - golint + + # Printf-like functions must have -f. + - goprintffuncname + + # Deprecated + - ifshort + + # Checks imports aliases, rare. + - importas + + # Forces tiny interfaces, very subjective. + - interfacebloat + + # Accept interfaces, return types. Not always. + - ireturn + + # I don't set line length. + - lll + + # Maintainability index of each function, subjective. + - maintidx + + # Slice declarations with non-zero initial length. + - makezero + + # Deprecated. Use govet `fieldalignment`. + - maligned + + # Deeply nested if statements, subjective. + - nestif + + # Reports all named returns, not that bad. + - nonamedreturns + + # Deprecated. Replaced by `revive`. + - nosnakecase + + # Finds misuse of Sprintf with host:port in a URL. Cool but rare. + - nosprintfhostport + + # I don't use t.Parallel() that much. + - paralleltest + + # Deprecated + - scopelint + + # Deprecated + - structcheck + + # Often non-`_test` package is ok. + - testpackage + + # Compiler can do it too :) + - typecheck + + # Deprecated + - varcheck + + # I'm fine with long variable names with a small scope. + - varnamelen + + # gofmt,gofumpt covers that (from what I know). + - whitespace + + # Don't find it useful to wrap all errors from external packages. + - wrapcheck + + # Forces you to use empty lines. Great if configured correctly. + # I mean there is an agreement in a team. + - wsl + +linters-settings: + # I'm biased, and I'm enabling more than 100 checks + # Might be too much for you. See https://go-critic.com/overview.html + gocritic: + enabled-tags: + - diagnostic + - experimental + - opinionated + - performance + - style + disabled-checks: + # These 3 will detect many cases, but they do sense + # if it's performance oriented code + - hugeParam + - rangeExprCopy + - rangeValCopy + + errcheck: + # Report `a := b.(MyStruct)` when `a, ok := ...` should be. + check-type-assertions: true # Default: false + + # Report skipped checks:`num, _ := strconv.Atoi(numStr)`. + check-blank: true # Default: false + + # Function to skip. + exclude-functions: + - io/ioutil.ReadFile + - io.Copy(*bytes.Buffer) + - io.Copy(os.Stdout) + + govet: + disable: + - fieldalignment # I'm ok to waste some bytes + + nakedret: + # No naked returns, ever. + max-func-lines: 1 # Default: 30 + + tagliatelle: + case: + rules: + json: snake # why it's not a `snake` by default?! + yaml: snake # why it's not a `snake` by default?! + xml: camel + bson: camel + avro: snake + mapstructure: kebab + +# See also https://gist.github.com/cristaloleg/dc29ca0ef2fb554de28d94c3c6f6dc88 + +output: + format: colored-line-number + + # I do not find this useful, parameter above already enables filepath + # with a line and column. + print-issued-lines: false + + # Must have. Easier to understand the output. + print-linter-name: true + + # No skips, everything should be reported. + uniq-by-line: false + + # No idea when this can be needed, maybe a multi module setup? + path-prefix: "" + + # Slightly easier to follow the results + getting deterministic output. + sort-results: true + +issues: + # Found it strange to skip the errors, setting 0 to have all the results. + max-issues-per-linter: 0 + + # Same here, nothing should be skipped to not miss errors. + max-same-issues: 0 + + # When set to `true` linter will analyze only new code which are + # not committed or after some specific revision. This is a cool + # feature when you're going to introduce linter into a big project. + # But I prefer going gradually package by package. + # So, it's set to `false` to scan all code. + new: false + + # 2 other params regarding git integration + + # Even with a recent GPT-4 release I still believe that + # I know better how to do my job and fix the suggestions. + fix: false \ No newline at end of file diff --git a/.rtx.toml b/.rtx.toml new file mode 100644 index 0000000..2fa9b24 --- /dev/null +++ b/.rtx.toml @@ -0,0 +1,21 @@ +[env] +# supports arbitrary env vars so rtx can be used like direnv/dotenv +GO_ENV = 'GOLANG_RTX' +RTX_DEBUG=true +RTX_USE_TOML=true #Set to 1 to default to using .rtx.toml +RTX_LOG_FILE='./rtx.log' #Output logs to a file. + +RTX_VERBOSE='1' #This shows the installation output during rtx install and rtx plugin install. +[tools] +golang = '1.21.5' +[settings] + + +verbose = true # set true to see full installation output +jobs = 4 # number of plugins or runtimes to install in parallel. The default is `4`. +yes = true # set to true to automatically answer yes to all prompts +experimental = false # enable experimental features +# log_level = 'debug' # log verbosity +[plugins] +golang = 'https://github.com/rtx-plugins/rtx-golang' + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..de2ccd1 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +// TODO: add commands for build and run in dev/produciton mode + +ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST)))) + +lint: + which golangci-lint || (go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.54.0) + golangci-lint run --config=$(ROOT)/.golangci.yml $(ROOT)/... + +test: + go test -v ./... + +format: + @which gofumpt || (go install mvdan.cc/gofumpt@latest) + @gofumpt -l -w $(ROOT) + @which gci || (go install github.com/daixiang0/gci@latest) + @gci write $(ROOT) + @which golangci-lint || (go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.54.0) + @golangci-lint run --fix diff --git a/delivery/http_server/server.go b/delivery/http_server/server.go index 60665b5..f9d867d 100644 --- a/delivery/http_server/server.go +++ b/delivery/http_server/server.go @@ -13,5 +13,4 @@ func New(config config.Config) Server { } func (s Server) Serve() { - -} \ No newline at end of file +} diff --git a/entity/kind_box.go b/entity/kind_box.go index 9e12faf..2e27448 100644 --- a/entity/kind_box.go +++ b/entity/kind_box.go @@ -6,7 +6,7 @@ type KindBox struct { ID uint TotalAmount uint ReceiverId uint - SenderId uint + SenderID uint SerialNumber string Status uint StatusChangedAt *time.Time diff --git a/entity/kind_box_req.go b/entity/kind_box_req.go index a17ed31..3a901ed 100644 --- a/entity/kind_box_req.go +++ b/entity/kind_box_req.go @@ -4,7 +4,7 @@ import "time" type KindBoxReq struct { ID uint - TypeId uint + TypeID uint CountRequested uint CountAccepted uint BenefactorID uint diff --git a/logger/logger.go b/logger/logger.go index b9a1288..cded39e 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -41,7 +41,7 @@ func L() *slog.Logger { return l } -// New is constructor logger with special settings +// New is constructor logger with special settings. func New(cfg Config, opt *slog.HandlerOptions) *slog.Logger { fileWriter := &lumberjack.Logger{ Filename: cfg.FilePath, diff --git a/main.go b/main.go index 7905807..da29a2c 100644 --- a/main.go +++ b/main.go @@ -1,5 +1,4 @@ package main func main() { - } diff --git a/param/kind_box/delete.go b/param/kind_box/delete.go index b7dda5a..83df716 100644 --- a/param/kind_box/delete.go +++ b/param/kind_box/delete.go @@ -4,5 +4,4 @@ type KindBoxDeleteRequest struct { kindBoxID uint } -type KindBoxDeleteResponse struct { -} +type KindBoxDeleteResponse struct{} diff --git a/param/kind_box/get_all.go b/param/kind_box/get_all.go index 3c03f4a..e200ef0 100644 --- a/param/kind_box/get_all.go +++ b/param/kind_box/get_all.go @@ -2,8 +2,7 @@ package param import "git.gocasts.ir/ebhomengo/niki/entity" -type KindBoxGetAllRequest struct { -} +type KindBoxGetAllRequest struct{} type KindBoxGetAllResponse struct { AllKindBox []entity.KindBox diff --git a/param/kind_box/get_by_id.go b/param/kind_box/get_by_id.go index c187af1..4e06d58 100644 --- a/param/kind_box/get_by_id.go +++ b/param/kind_box/get_by_id.go @@ -2,10 +2,10 @@ package param import "git.gocasts.ir/ebhomengo/niki/entity" -type KindBoxGetByIdRequest struct { +type KindBoxGetByIDRequest struct { kindBoxID uint } -type KindBoxGetByIdResponse struct { +type KindBoxGetByIDResponse struct { entity.KindBox } diff --git a/param/kind_box_req/delete.go b/param/kind_box_req/delete.go index cc03fca..e09fda2 100644 --- a/param/kind_box_req/delete.go +++ b/param/kind_box_req/delete.go @@ -4,5 +4,4 @@ type KindBoxReqDeleteRequest struct { kindBoxID uint } -type KindBoxReqDeleteResponse struct { -} +type KindBoxReqDeleteResponse struct{} diff --git a/param/kind_box_req/get_all.go b/param/kind_box_req/get_all.go index 8bf020a..c29bbe7 100644 --- a/param/kind_box_req/get_all.go +++ b/param/kind_box_req/get_all.go @@ -2,8 +2,7 @@ package param import "git.gocasts.ir/ebhomengo/niki/entity" -type KindBoxReqGetAllRequest struct { -} +type KindBoxReqGetAllRequest struct{} type KindBoxReqGetAllResponse struct { AllKindBoxReq []entity.KindBoxReq diff --git a/param/kind_box_req/get_by_id.go b/param/kind_box_req/get_by_id.go index c3617e2..8b9d19f 100644 --- a/param/kind_box_req/get_by_id.go +++ b/param/kind_box_req/get_by_id.go @@ -2,10 +2,10 @@ package param import "git.gocasts.ir/ebhomengo/niki/entity" -type KindBoxReqGetByIdRequest struct { +type KindBoxReqGetByIDRequest struct { KindBoxReqID uint } -type KindBoxReqGetByIdResponse struct { +type KindBoxReqGetByIDResponse struct { entity.KindBoxReq } diff --git a/pkg/http_msg/mapper.go b/pkg/http_msg/mapper.go index a8973ee..458a047 100644 --- a/pkg/http_msg/mapper.go +++ b/pkg/http_msg/mapper.go @@ -1,9 +1,10 @@ package httpmsg import ( - "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" - "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" "net/http" + + errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" + richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" ) func Error(err error) (message string, code int) { diff --git a/repository/mysql/mysql_kind_box/db.go b/repository/mysql/mysql_kind_box/db.go index 911cc8a..6893e17 100644 --- a/repository/mysql/mysql_kind_box/db.go +++ b/repository/mysql/mysql_kind_box/db.go @@ -10,4 +10,4 @@ func New(conn *mysql.MySQLDB) *DB { return &DB{ conn: conn, } -} \ No newline at end of file +} diff --git a/repository/mysql/mysql_kind_box/kind_box.go b/repository/mysql/mysql_kind_box/kind_box.go index 1100ef3..6dcf146 100644 --- a/repository/mysql/mysql_kind_box/kind_box.go +++ b/repository/mysql/mysql_kind_box/kind_box.go @@ -1 +1 @@ -package mysqlkindbox \ No newline at end of file +package mysqlkindbox diff --git a/service/kind_box/get_by_id.go b/service/kind_box/get_by_id.go index e7c8a82..07582af 100644 --- a/service/kind_box/get_by_id.go +++ b/service/kind_box/get_by_id.go @@ -2,7 +2,7 @@ package kindboxservice import param "git.gocasts.ir/ebhomengo/niki/param/kind_box" -func (s Service) GetById(request param.KindBoxGetByIdRequest) (param.KindBoxGetByIdResponse, error) { +func (s Service) GetByID(request param.KindBoxGetByIDRequest) (param.KindBoxGetByIDResponse, error) { // some code panic("not implement") } diff --git a/service/kind_box_req/delete.go b/service/kind_box_req/delete.go index ac2aae9..d3cd031 100644 --- a/service/kind_box_req/delete.go +++ b/service/kind_box_req/delete.go @@ -2,7 +2,7 @@ package kindboxreqservice import param "git.gocasts.ir/ebhomengo/niki/param/kind_box_req" -func (s Service) Delete(kindBoxReqId param.KindBoxReqDeleteRequest) error { +func (s Service) Delete(kindBoxReqID param.KindBoxReqDeleteRequest) error { // some code panic("not implemented") } diff --git a/service/kind_box_req/get_by_id.go b/service/kind_box_req/get_by_id.go index 24dd6da..0846fe4 100644 --- a/service/kind_box_req/get_by_id.go +++ b/service/kind_box_req/get_by_id.go @@ -2,7 +2,7 @@ package kindboxreqservice import param "git.gocasts.ir/ebhomengo/niki/param/kind_box_req" -func (s Service) GetById(request param.KindBoxReqGetByIdRequest) (param.KindBoxReqGetByIdResponse, error) { +func (s Service) GetByID(request param.KindBoxReqGetByIDRequest) (param.KindBoxReqGetByIDResponse, error) { // some code panic("not implement") }