Skip to content

Commit ce0cb98

Browse files
feat(config): return multiple errors in Validate
1 parent ebd90a9 commit ce0cb98

File tree

4 files changed

+46
-19
lines changed

4 files changed

+46
-19
lines changed

cmd/callback.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ func configCreate(onlyEnabled bool) error {
5353
}
5454

5555
// configCheck is the callback function for check/verify command
56-
func configCheck(confPath string) error {
56+
func configCheck(confPath string) []error {
5757
conf, err := config.Parse(confPath)
5858
if err != nil {
59-
return err
59+
return []error{err}
6060
}
6161
return config.Validate(conf)
6262
}

cmd/cmd.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,16 @@ func configCmd() *cli.Command {
124124
},
125125
Action: func(ctx *cli.Context) error {
126126
confFile := ctx.String("config")
127-
err := configCheck(confFile)
128-
if err != nil {
129-
return err
127+
errs := configCheck(confFile)
128+
if len(errs) == 0 {
129+
fmt.Printf("%s config is valid\n", confFile)
130+
return nil
130131
}
131-
fmt.Printf("%s config is valid\n", confFile)
132-
return nil
132+
if len(errs) == 1 {
133+
return errs[0]
134+
}
135+
merr := multiError(errs)
136+
return &merr
133137
},
134138
}
135139

cmd/errors.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package cmd
2+
3+
import "strings"
4+
5+
type multiError []error
6+
7+
func (m *multiError) Error() string {
8+
errs := make([]string, len(*m))
9+
for i, err := range *m {
10+
errs[i] = err.Error()
11+
}
12+
return strings.Join(errs, "\n")
13+
}
14+
15+
func (m *multiError) Errors() []error {
16+
errs := make([]error, len(*m))
17+
for _, err := range *m {
18+
errs = append(errs, err)
19+
}
20+
return errs
21+
}

config/config.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,16 @@ func Parse(confPath string) (*lint.Config, error) {
8383
}
8484

8585
// Validate validates given config
86-
func Validate(conf *lint.Config) error {
87-
if conf.Formatter == "" {
88-
return errors.New("formatter is empty")
89-
}
86+
func Validate(conf *lint.Config) []error {
87+
var errs []error
9088

91-
_, ok := globalRegistry.GetFormatter(conf.Formatter)
92-
if !ok {
93-
return fmt.Errorf("unknown formatter '%s'", conf.Formatter)
89+
if conf.Formatter == "" {
90+
errs = append(errs, errors.New("formatter is empty"))
91+
} else {
92+
_, ok := globalRegistry.GetFormatter(conf.Formatter)
93+
if !ok {
94+
errs = append(errs, fmt.Errorf("unknown formatter '%s'", conf.Formatter))
95+
}
9496
}
9597

9698
for ruleName, r := range conf.Rules {
@@ -99,22 +101,22 @@ func Validate(conf *lint.Config) error {
99101
case lint.SeverityError:
100102
case lint.SeverityWarn:
101103
default:
102-
return fmt.Errorf("unknown severity level '%s' for rule '%s'", r.Severity, ruleName)
104+
errs = append(errs, fmt.Errorf("unknown severity level '%s' for rule '%s'", r.Severity, ruleName))
103105
}
104106

105107
// Check if rule is registered
106108
ruleData, ok := globalRegistry.GetRule(ruleName)
107109
if !ok {
108-
return fmt.Errorf("unknown rule '%s'", ruleName)
110+
errs = append(errs, fmt.Errorf("unknown rule '%s'", ruleName))
111+
continue
109112
}
110113

111114
err := ruleData.Apply(r.Argument, r.Flags)
112115
if err != nil {
113-
return err
116+
errs = append(errs, err)
114117
}
115118
}
116-
117-
return nil
119+
return errs
118120
}
119121

120122
// WriteConfToFile util func to write config object to given file

0 commit comments

Comments
 (0)