github.com/thrasher-corp/golangci-lint@v1.17.3/pkg/lint/lintersdb/validator.go (about) 1 package lintersdb 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/golangci/golangci-lint/pkg/config" 8 ) 9 10 type Validator struct { 11 m *Manager 12 } 13 14 func NewValidator(m *Manager) *Validator { 15 return &Validator{ 16 m: m, 17 } 18 } 19 20 func (v Validator) validateLintersNames(cfg *config.Linters) error { 21 allNames := append([]string{}, cfg.Enable...) 22 allNames = append(allNames, cfg.Disable...) 23 for _, name := range allNames { 24 if v.m.GetLinterConfig(name) == nil && v.m.GetMetaLinter(name) == nil { 25 return fmt.Errorf("no such linter %q", name) 26 } 27 } 28 29 return nil 30 } 31 32 func (v Validator) validatePresets(cfg *config.Linters) error { 33 allPresets := v.m.allPresetsSet() 34 for _, p := range cfg.Presets { 35 if !allPresets[p] { 36 return fmt.Errorf("no such preset %q: only next presets exist: (%s)", 37 p, strings.Join(v.m.AllPresets(), "|")) 38 } 39 } 40 41 if len(cfg.Presets) != 0 && cfg.EnableAll { 42 return fmt.Errorf("--presets is incompatible with --enable-all") 43 } 44 45 return nil 46 } 47 48 func (v Validator) validateAllDisableEnableOptions(cfg *config.Linters) error { 49 if cfg.EnableAll && cfg.DisableAll { 50 return fmt.Errorf("--enable-all and --disable-all options must not be combined") 51 } 52 53 if cfg.DisableAll { 54 if len(cfg.Enable) == 0 && len(cfg.Presets) == 0 { 55 return fmt.Errorf("all linters were disabled, but no one linter was enabled: must enable at least one") 56 } 57 58 if len(cfg.Disable) != 0 { 59 return fmt.Errorf("can't combine options --disable-all and --disable %s", cfg.Disable[0]) 60 } 61 } 62 63 if cfg.EnableAll && len(cfg.Enable) != 0 && !cfg.Fast { 64 return fmt.Errorf("can't combine options --enable-all and --enable %s", cfg.Enable[0]) 65 } 66 67 return nil 68 } 69 70 func (v Validator) validateDisabledAndEnabledAtOneMoment(cfg *config.Linters) error { 71 enabledLintersSet := map[string]bool{} 72 for _, name := range cfg.Enable { 73 enabledLintersSet[name] = true 74 } 75 76 for _, name := range cfg.Disable { 77 if enabledLintersSet[name] { 78 return fmt.Errorf("linter %q can't be disabled and enabled at one moment", name) 79 } 80 } 81 82 return nil 83 } 84 85 func (v Validator) validateEnabledDisabledLintersConfig(cfg *config.Linters) error { 86 validators := []func(cfg *config.Linters) error{ 87 v.validateLintersNames, 88 v.validatePresets, 89 v.validateAllDisableEnableOptions, 90 v.validateDisabledAndEnabledAtOneMoment, 91 } 92 for _, v := range validators { 93 if err := v(cfg); err != nil { 94 return err 95 } 96 } 97 98 return nil 99 }