From 0c3d63194d3edc243f081bd2cafe429673bf8c1c Mon Sep 17 00:00:00 2001 From: Alexander Yastrebov Date: Mon, 20 Jan 2025 18:18:14 +0100 Subject: [PATCH] all: re-enable staticcheck rule ST1012 Rename error variables and re-enable staticheck [ST1012 - Poorly chosen name for error variable](https://staticcheck.dev/docs/checks/#ST1012) rule. All renamed variables are non-exported except errInvalidArgs in predicates/source which was made unexported. Follow up on #897 Signed-off-by: Alexander Yastrebov --- Makefile | 4 +--- cmd/eskip/args.go | 12 ++++++------ cmd/eskip/args_test.go | 4 ++-- cmd/eskip/eskip.go | 10 +++++----- cmd/eskip/eskip_test.go | 4 ++-- cmd/eskip/load.go | 6 +++--- cmd/eskip/load_test.go | 11 ++--------- cmd/eskip/media.go | 30 +++++++++++++++--------------- cmd/eskip/media_test.go | 14 +++++++------- cmd/eskip/readclient.go | 2 +- cmd/eskip/writeclient.go | 4 ++-- eskip/eskip.go | 8 ++++---- eskip/lexer.go | 30 +++++++++++++++--------------- etcd/etcd.go | 30 +++++++++++++++--------------- etcd/etcd_test.go | 6 +++--- filters/builtin/compress.go | 8 ++++---- filters/builtin/compress_test.go | 2 +- packaging/version/version.go | 6 +++--- predicates/source/source.go | 6 +++--- 19 files changed, 94 insertions(+), 103 deletions(-) diff --git a/Makefile b/Makefile index 1b0f9b64eb..f59368bdc4 100644 --- a/Makefile +++ b/Makefile @@ -130,12 +130,10 @@ vet: $(SOURCES) ## run Go vet # TODO(sszuecs) review disabling these checks, f.e.: # -ST1000 missing package doc in many packages # -ST1003 wrong naming convention Api vs API, Id vs ID -# -ST1012 too many error variables are not having prefix "err" # -ST1020 too many wrong comments on exported functions to fix right away # -ST1021 too many wrong comments on exported functions to fix right away -# -ST1022 too many wrong comments on exported functions to fix right away staticcheck: $(SOURCES) ## run staticcheck - staticcheck -checks "all,-ST1000,-ST1003,-ST1012,-ST1020,-ST1021" ./... + staticcheck -checks "all,-ST1000,-ST1003,-ST1020,-ST1021" ./... .PHONY: gosec # TODO(sszuecs) review disabling these checks, f.e.: diff --git a/cmd/eskip/args.go b/cmd/eskip/args.go index 8588b005f1..a56d08d75e 100644 --- a/cmd/eskip/args.go +++ b/cmd/eskip/args.go @@ -55,9 +55,9 @@ func (w *noopWriter) Write(b []byte) (int, error) { } var ( - invalidNumberOfArgs = errors.New("invalid number of args") - missingOAuthToken = errors.New("missing OAuth token") - invalidIndentStr = errors.New("invalid indent. Must match regexp \\s") + errInvalidNumberOfArgs = errors.New("invalid number of args") + errMissingOAuthToken = errors.New("missing OAuth token") + errInvalidIndentStr = errors.New("invalid indent. Must match regexp \\s") ) // parsing vars for flags: @@ -175,7 +175,7 @@ func processInnkeeperArgs(innkeeperUrl, oauthToken string) (*medium, error) { } if oauthToken == "" { - return nil, missingOAuthToken + return nil, errMissingOAuthToken } if innkeeperUrl == "" { @@ -197,7 +197,7 @@ func processInnkeeperArgs(innkeeperUrl, oauthToken string) (*medium, error) { func processFileArg() (*medium, error) { nonFlagArgs := flags.Args() if len(nonFlagArgs) > 1 { - return nil, invalidNumberOfArgs + return nil, errInvalidNumberOfArgs } if len(nonFlagArgs) == 0 { @@ -212,7 +212,7 @@ func processFileArg() (*medium, error) { // if pretty print then check that indent matches pattern func processIndentStr() error { if pretty && !(regexp.MustCompile(`^[\s]*$`).MatchString(indentStr)) { - return invalidIndentStr + return errInvalidIndentStr } return nil diff --git a/cmd/eskip/args_test.go b/cmd/eskip/args_test.go index 57f1397a17..78fbe57bae 100644 --- a/cmd/eskip/args_test.go +++ b/cmd/eskip/args_test.go @@ -118,7 +118,7 @@ func TestProcessArgs(t *testing.T) { // innkeeper-url missing token []string{"-innkeeper-url", "https://innkeeper.example.org"}, true, - missingOAuthToken, + errMissingOAuthToken, nil, }, { @@ -166,7 +166,7 @@ func TestProcessArgs(t *testing.T) { // too many files []string{"file1", "file2"}, true, - invalidNumberOfArgs, + errInvalidNumberOfArgs, nil, }, { diff --git a/cmd/eskip/eskip.go b/cmd/eskip/eskip.go index 0626b71202..f948c78463 100644 --- a/cmd/eskip/eskip.go +++ b/cmd/eskip/eskip.go @@ -52,8 +52,8 @@ var commands = map[command]commandFunc{ ver: versionCmd} var ( - missingCommand = errors.New("missing command") - invalidCommand = errors.New("invalid command") + errMissingCommand = errors.New("missing command") + errInvalidCommand = errors.New("invalid command") ) var stdout io.Writer = os.Stdout @@ -90,18 +90,18 @@ func exit(err error) { exitErrHint(err, false) } // second argument must be the ('sub') command. func getCommand(args []string) (command, error) { if len(args) < 2 { - return "", missingCommand + return "", errMissingCommand } cmd := command(args[1]) if cmd[0] == '-' { - return "", missingCommand + return "", errMissingCommand } if _, ok := commands[cmd]; ok { return cmd, nil } else { - return "", invalidCommand + return "", errInvalidCommand } } diff --git a/cmd/eskip/eskip_test.go b/cmd/eskip/eskip_test.go index 7457b79c21..428f98266c 100644 --- a/cmd/eskip/eskip_test.go +++ b/cmd/eskip/eskip_test.go @@ -13,14 +13,14 @@ func TestGetCommandSuccess(t *testing.T) { func TestGetCommandFail(t *testing.T) { _, err := getCommand([]string{"some", "hello"}) - if err != invalidCommand { + if err != errInvalidCommand { t.Error("hello is an invalid command") } } func TestGetCommandEmpty(t *testing.T) { _, err := getCommand([]string{"some"}) - if err != missingCommand { + if err != errMissingCommand { t.Error("empty should fail ") } } diff --git a/cmd/eskip/load.go b/cmd/eskip/load.go index 050ae97c30..fa58fef345 100644 --- a/cmd/eskip/load.go +++ b/cmd/eskip/load.go @@ -28,7 +28,7 @@ type loadResult struct { parseErrors map[string]error } -var invalidRouteExpression = errors.New("one or more invalid route expressions") +var errInvalidRouteExpression = errors.New("one or more invalid route expressions") // store all loaded routes, even if invalid, and store the // parse errors if any. @@ -67,7 +67,7 @@ func checkParseErrors(lr loadResult) error { printStderr(id, perr) } - return invalidRouteExpression + return errInvalidRouteExpression } // load, parse routes and print parse errors if any. @@ -146,7 +146,7 @@ func printCmd(a cmdArgs) error { } if len(lr.parseErrors) > 0 { - return invalidRouteExpression + return errInvalidRouteExpression } return nil diff --git a/cmd/eskip/load_test.go b/cmd/eskip/load_test.go index e7aa5e45f4..ada1afe55a 100644 --- a/cmd/eskip/load_test.go +++ b/cmd/eskip/load_test.go @@ -16,7 +16,6 @@ package main import ( "bytes" - "errors" "os" "strings" "testing" @@ -26,8 +25,6 @@ import ( const testStdinName = "testStdin" -var ioError = errors.New("io error") - func preserveStdin(f *os.File, action func()) { f, os.Stdin = os.Stdin, f defer func() { os.Stdin = f }() @@ -61,11 +58,7 @@ func withFile(name string, content string, action func(f *os.File)) error { withError(func() { err = os.Remove(name) }) - if err == nil { - return nil - } - - return ioError + return err } func withStdin(content string, action func()) error { @@ -173,7 +166,7 @@ func TestCheckEtcdInvalid(t *testing.T) { } err = checkCmd(cmdArgs{in: &medium{typ: etcd, urls: urls, path: "/skippertest"}}) - if err != invalidRouteExpression { + if err != errInvalidRouteExpression { t.Error("failed to fail properly") } } diff --git a/cmd/eskip/media.go b/cmd/eskip/media.go index 5c67f42f15..e1f352ac92 100644 --- a/cmd/eskip/media.go +++ b/cmd/eskip/media.go @@ -57,9 +57,9 @@ type medium struct { } var ( - tooManyInputs = errors.New("too many inputs") - invalidInputType = errors.New("invalid input type") - missingInput = errors.New("missing input") + errTooManyInputs = errors.New("too many inputs") + errInvalidInputType = errors.New("invalid input type") + errMissingInput = errors.New("missing input") ) // validate medium from args, and check if it can be used @@ -67,7 +67,7 @@ var ( // (check and print) func validateSelectRead(media []*medium) (a cmdArgs, err error) { if len(media) > 1 { - err = tooManyInputs + err = errTooManyInputs return } @@ -78,7 +78,7 @@ func validateSelectRead(media []*medium) (a cmdArgs, err error) { switch media[0].typ { case inlineIds, patchPrepend, patchPrependFile, patchAppend, patchAppendFile: - err = invalidInputType + err = errInvalidInputType return } @@ -89,19 +89,19 @@ func validateSelectRead(media []*medium) (a cmdArgs, err error) { // validate media from args, and check if input was specified. func validateSelectWrite(media []*medium) (a cmdArgs, err error) { if len(media) == 0 { - err = missingInput + err = errMissingInput return } if len(media) > 2 { - err = tooManyInputs + err = errTooManyInputs return } for _, m := range media { switch media[0].typ { case inlineIds, patchPrepend, patchPrependFile, patchAppend, patchAppendFile: - err = invalidInputType + err = errInvalidInputType return } @@ -113,7 +113,7 @@ func validateSelectWrite(media []*medium) (a cmdArgs, err error) { } if a.in == nil { - err = missingInput + err = errMissingInput } return @@ -121,19 +121,19 @@ func validateSelectWrite(media []*medium) (a cmdArgs, err error) { func validateSelectDelete(media []*medium) (a cmdArgs, err error) { if len(media) == 0 { - err = missingInput + err = errMissingInput return } if len(media) > 2 { - err = tooManyInputs + err = errTooManyInputs return } for _, m := range media { switch media[0].typ { case patchPrepend, patchPrependFile, patchAppend, patchAppendFile: - err = invalidInputType + err = errInvalidInputType return } @@ -145,7 +145,7 @@ func validateSelectDelete(media []*medium) (a cmdArgs, err error) { } if a.in == nil { - err = missingInput + err = errMissingInput } return @@ -156,11 +156,11 @@ func validateSelectPatch(media []*medium) (a cmdArgs, err error) { switch m.typ { case patchPrepend, patchPrependFile, patchAppend, patchAppendFile: case inlineIds: - err = invalidInputType + err = errInvalidInputType return default: if a.in != nil { - err = tooManyInputs + err = errTooManyInputs return } diff --git a/cmd/eskip/media_test.go b/cmd/eskip/media_test.go index 5e15ccc44c..3a8a395ecd 100644 --- a/cmd/eskip/media_test.go +++ b/cmd/eskip/media_test.go @@ -69,7 +69,7 @@ func TestValidateSelectMedia(t *testing.T) { "check", []*medium{{}, {}}, true, - tooManyInputs, + errTooManyInputs, nil, nil, }, { @@ -78,7 +78,7 @@ func TestValidateSelectMedia(t *testing.T) { "check", []*medium{{typ: inlineIds}}, true, - invalidInputType, + errInvalidInputType, nil, nil, }, { @@ -119,7 +119,7 @@ func TestValidateSelectMedia(t *testing.T) { "upsert", nil, true, - missingInput, + errMissingInput, nil, nil, }, { @@ -128,7 +128,7 @@ func TestValidateSelectMedia(t *testing.T) { "upsert", []*medium{{typ: stdin}, {typ: file}, {typ: etcd}}, true, - tooManyInputs, + errTooManyInputs, nil, nil, }, { @@ -137,7 +137,7 @@ func TestValidateSelectMedia(t *testing.T) { "upsert", []*medium{{typ: inlineIds}}, true, - invalidInputType, + errInvalidInputType, nil, nil, }, { @@ -155,7 +155,7 @@ func TestValidateSelectMedia(t *testing.T) { "delete", []*medium{{typ: innkeeper}}, true, - missingInput, + errMissingInput, nil, nil, }, { @@ -173,7 +173,7 @@ func TestValidateSelectMedia(t *testing.T) { "upsert", []*medium{{typ: inlineIds}}, true, - invalidInputType, + errInvalidInputType, nil, nil, }, { diff --git a/cmd/eskip/readclient.go b/cmd/eskip/readclient.go index 6c0c20b73e..479e6da74e 100644 --- a/cmd/eskip/readclient.go +++ b/cmd/eskip/readclient.go @@ -52,7 +52,7 @@ func createReadClient(m *medium) (readClient, error) { return &idsReader{ids: m.ids}, nil default: - return nil, invalidInputType + return nil, errInvalidInputType } } diff --git a/cmd/eskip/writeclient.go b/cmd/eskip/writeclient.go index 6a48cfe68d..5787207919 100644 --- a/cmd/eskip/writeclient.go +++ b/cmd/eskip/writeclient.go @@ -13,7 +13,7 @@ type writeClient interface { DeleteAllIf(routes []*eskip.Route, cond eskip.RoutePredicate) error } -var invalidOutput = errors.New("invalid output") +var errInvalidOutput = errors.New("invalid output") func createWriteClient(out *medium) (writeClient, error) { // no output, no client @@ -29,5 +29,5 @@ func createWriteClient(out *medium) (writeClient, error) { Insecure: insecure, OAuthToken: out.oauthToken}) } - return nil, invalidOutput + return nil, errInvalidOutput } diff --git a/eskip/eskip.go b/eskip/eskip.go index 5bb5d39855..1aecde9118 100644 --- a/eskip/eskip.go +++ b/eskip/eskip.go @@ -17,8 +17,8 @@ import ( const duplicateHeaderPredicateErrorFmt = "duplicate header predicate: %s" var ( - duplicatePathTreePredicateError = errors.New("duplicate path tree predicate") - duplicateMethodPredicateError = errors.New("duplicate method predicate") + errDuplicatePathTreePredicate = errors.New("duplicate path tree predicate") + errDuplicateMethodPredicate = errors.New("duplicate method predicate") ) // NewEditor creates an Editor PreProcessor, that matches routes and @@ -484,7 +484,7 @@ func applyPredicates(route *Route, proute *parsedRoute) error { switch p.Name { case "Path": if pathSet { - return duplicatePathTreePredicateError + return errDuplicatePathTreePredicate } if args, err = getStringArgs(p, 1); err == nil { @@ -501,7 +501,7 @@ func applyPredicates(route *Route, proute *parsedRoute) error { } case "Method": if methodSet { - return duplicateMethodPredicateError + return errDuplicateMethodPredicate } if args, err = getStringArgs(p, 1); err == nil { diff --git a/eskip/lexer.go b/eskip/lexer.go index b960ebd291..a6ca91c30f 100644 --- a/eskip/lexer.go +++ b/eskip/lexer.go @@ -35,11 +35,11 @@ const ( ) var ( - invalidCharacter = errors.New("invalid character") - incompleteToken = errors.New("incomplete token") - unexpectedToken = errors.New("unexpected token") - void = errors.New("void") - eof = errors.New("eof") + errInvalidCharacter = errors.New("invalid character") + errIncompleteToken = errors.New("incomplete token") + errUnexpectedToken = errors.New("unexpected token") + errVoid = errors.New("void") + errEOF = errors.New("eof") ) var ( @@ -192,7 +192,7 @@ func scanRegexpLiteral(code string) (t token, rest string, err error) { t.id = regexpliteral t.val, rest = scanRegexp(code[1:]) if len(rest) == 0 { - err = incompleteToken + err = errIncompleteToken return } @@ -204,13 +204,13 @@ func scanRegexpLiteral(code string) (t token, rest string, err error) { func scanRegexpOrComment(code string) (t token, rest string, err error) { if len(code) < 2 { rest = code - err = invalidCharacter + err = errInvalidCharacter return } if code[1] == '/' { rest = scanComment(code) - err = void + err = errVoid return } @@ -221,7 +221,7 @@ func scanStringLiteral(delimiter byte, code string) (t token, rest string, err e t.id = stringliteral t.val, rest = scanEscaped(delimiter, code[1:]) if len(rest) == 0 { - err = incompleteToken + err = errIncompleteToken return } @@ -264,7 +264,7 @@ func scanNumber(code string) (t token, rest string, err error) { }) if isDecimalChar(t.val[len(t.val)-1]) { - err = incompleteToken + err = errIncompleteToken return } @@ -331,22 +331,22 @@ func scan(code string) (token, string, error) { return scanSymbol(code) } - return token{}, "", unexpectedToken + return token{}, "", errUnexpectedToken } func (l *eskipLex) next() (token, error) { l.code = scanWhitespace(l.code) if len(l.code) == 0 { - return token{}, eof + return token{}, errEOF } t, rest, err := scan(l.code) - if err == unexpectedToken { + if err == errUnexpectedToken { return token{}, err } l.code = rest - if err == void { + if err == errVoid { return l.next() } @@ -366,7 +366,7 @@ func (l *eskipLex) Lex(lval *eskipSymType) int { } t, err := l.next() - if err == eof { + if err == errEOF { return -1 } diff --git a/etcd/etcd.go b/etcd/etcd.go index 50843f103a..8db0a1507a 100644 --- a/etcd/etcd.go +++ b/etcd/etcd.go @@ -117,18 +117,18 @@ type Client struct { } var ( - missingEtcdEndpoint = errors.New("missing etcd endpoint") - missingRouteId = errors.New("missing route id") - invalidNode = errors.New("invalid node") - unexpectedHttpResponse = errors.New("unexpected http response") - notFound = errors.New("not found") - invalidResponseDocument = errors.New("invalid response document") + errMissingEtcdEndpoint = errors.New("missing etcd endpoint") + errMissingRouteId = errors.New("missing route id") + errInvalidNode = errors.New("invalid node") + errUnexpectedHttpResponse = errors.New("unexpected http response") + errNotFound = errors.New("not found") + errInvalidResponseDocument = errors.New("invalid response document") ) // Creates a new Client with the provided options. func New(o Options) (*Client, error) { if len(o.Endpoints) == 0 { - return nil, missingEtcdEndpoint + return nil, errMissingEtcdEndpoint } if o.Timeout == 0 { @@ -228,7 +228,7 @@ func parseResponse(rsp *http.Response) (*response, error) { } if r.Node == nil || r.Node.Key == "" { - return nil, invalidResponseDocument + return nil, errInvalidResponseDocument } r.etcdIndex, err = strconv.ParseUint(rsp.Header.Get(etcdIndexHeader), 10, 64) @@ -239,11 +239,11 @@ func parseResponse(rsp *http.Response) (*response, error) { // As the first argument, returns true in case of error. func httpError(code int) (bool, error) { if code == http.StatusNotFound { - return true, notFound + return true, errNotFound } if code < http.StatusOK || code >= http.StatusMultipleChoices { - return true, unexpectedHttpResponse + return true, errUnexpectedHttpResponse } return false, nil @@ -387,7 +387,7 @@ func infoToRoutesLogged(info []*eskip.RouteInfo) []*eskip.Route { // or the parsing error in case of failure. func (c *Client) LoadAndParseAll() ([]*eskip.RouteInfo, error) { response, err := c.etcdGet() - if err == notFound { + if err == errNotFound { return nil, nil } @@ -396,7 +396,7 @@ func (c *Client) LoadAndParseAll() ([]*eskip.RouteInfo, error) { } if !response.Node.Dir { - return nil, invalidNode + return nil, errInvalidNode } data, etcdIndex := c.iterateNodes(response.Node, 0) @@ -471,7 +471,7 @@ func (c *Client) LoadUpdate() ([]*eskip.Route, []string, error) { // Inserts or updates a route in etcd. func (c *Client) Upsert(r *eskip.Route) error { if r.Id == "" { - return missingRouteId + return errMissingRouteId } return c.etcdSet(r) @@ -480,11 +480,11 @@ func (c *Client) Upsert(r *eskip.Route) error { // Deletes a route from etcd. func (c *Client) Delete(id string) error { if id == "" { - return missingRouteId + return errMissingRouteId } err := c.etcdDelete(id) - if err == notFound { + if err == errNotFound { err = nil } diff --git a/etcd/etcd_test.go b/etcd/etcd_test.go index 7086589349..df01478b75 100644 --- a/etcd/etcd_test.go +++ b/etcd/etcd_test.go @@ -202,7 +202,7 @@ func TestValidatesDocument(t *testing.T) { } _, err = c.LoadAll() - if err != invalidResponseDocument { + if err != errInvalidResponseDocument { t.Error("failed to fail") } } @@ -399,7 +399,7 @@ func TestUpsertNoId(t *testing.T) { } err = c.Upsert(&eskip.Route{}) - if err != missingRouteId { + if err != errMissingRouteId { t.Error("failed to fail") } } @@ -480,7 +480,7 @@ func TestDeleteNoId(t *testing.T) { } err = c.Delete("") - if err != missingRouteId { + if err != errMissingRouteId { t.Error("failed to fail") } } diff --git a/filters/builtin/compress.go b/filters/builtin/compress.go index f28f281921..1aa8104202 100644 --- a/filters/builtin/compress.go +++ b/filters/builtin/compress.go @@ -46,8 +46,8 @@ type encoder interface { } var ( - supportedEncodings = []string{"gzip", "deflate", "br"} - unsupportedEncoding = errors.New("unsupported encoding") + supportedEncodings = []string{"gzip", "deflate", "br"} + errUnsupportedEncoding = errors.New("unsupported encoding") ) var defaultCompressMIME = []string{ @@ -159,7 +159,7 @@ func NewCompressWithOptions(options CompressOptions) (filters.Spec, error) { m := map[string]int{} for i, v := range options.Encodings { if !stringsContain(supportedEncodings, v) { - return nil, unsupportedEncoding + return nil, errUnsupportedEncoding } m[v] = i } @@ -303,7 +303,7 @@ func responseHeader(r *http.Response, enc string) { // these functions are only called from inside the package, and the // encoding should be selected from a predefined set. func unsupported() { - panic(unsupportedEncoding) + panic(errUnsupportedEncoding) } func newEncoder(enc string, level int) (encoder, error) { diff --git a/filters/builtin/compress_test.go b/filters/builtin/compress_test.go index 0026dbe789..29b3ba9b44 100644 --- a/filters/builtin/compress_test.go +++ b/filters/builtin/compress_test.go @@ -85,7 +85,7 @@ func decoder(enc string, r io.Reader) io.Reader { case "deflate": return flate.NewReader(r) default: - panic(unsupportedEncoding) + panic(errUnsupportedEncoding) } } diff --git a/packaging/version/version.go b/packaging/version/version.go index f75345ea9d..51911302e8 100644 --- a/packaging/version/version.go +++ b/packaging/version/version.go @@ -15,7 +15,7 @@ const ( cmdPatch = "patch" ) -var invalidCommand = errors.New("invalid command") +var errInvalidCommand = errors.New("invalid command") func usage() string { return `version ` @@ -23,14 +23,14 @@ func usage() string { func command() (string, string, error) { if len(os.Args) != 3 { - return "", "", invalidCommand + return "", "", errInvalidCommand } switch os.Args[1] { case cmdMajor, cmdMinor, cmdPatch: return os.Args[1], os.Args[2], nil default: - return "", "", invalidCommand + return "", "", errInvalidCommand } } diff --git a/predicates/source/source.go b/predicates/source/source.go index 580dc86dcd..0a47c36d64 100644 --- a/predicates/source/source.go +++ b/predicates/source/source.go @@ -60,7 +60,7 @@ const ( NameClientIP = predicates.ClientIPName ) -var InvalidArgsError = errors.New("invalid arguments") +var errInvalidArgs = errors.New("invalid arguments") type sourcePred int @@ -96,7 +96,7 @@ func (s *spec) Name() string { func (s *spec) Create(args []interface{}) (routing.Predicate, error) { if len(args) == 0 { - return nil, InvalidArgsError + return nil, errInvalidArgs } var cidrs []string @@ -104,7 +104,7 @@ func (s *spec) Create(args []interface{}) (routing.Predicate, error) { if s, ok := args[i].(string); ok { cidrs = append(cidrs, s) } else { - return nil, InvalidArgsError + return nil, errInvalidArgs } }