github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/lint/lintersdb/validator.go (about) 1 package lintersdb 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/elek/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 24 unknownNames := []string{} 25 26 for _, name := range allNames { 27 if v.m.GetLinterConfigs(name) == nil { 28 unknownNames = append(unknownNames, name) 29 } 30 } 31 32 if len(unknownNames) > 0 { 33 return fmt.Errorf("unknown linters: '%v', run 'golangci-lint help linters' to see the list of supported linters", 34 strings.Join(unknownNames, ",")) 35 } 36 37 return nil 38 } 39 40 func (v Validator) validatePresets(cfg *config.Linters) error { 41 allPresets := v.m.allPresetsSet() 42 for _, p := range cfg.Presets { 43 if !allPresets[p] { 44 return fmt.Errorf("no such preset %q: only next presets exist: (%s)", 45 p, strings.Join(v.m.AllPresets(), "|")) 46 } 47 } 48 49 if len(cfg.Presets) != 0 && cfg.EnableAll { 50 return fmt.Errorf("--presets is incompatible with --enable-all") 51 } 52 53 return nil 54 } 55 56 func (v Validator) validateAllDisableEnableOptions(cfg *config.Linters) error { 57 if cfg.EnableAll && cfg.DisableAll { 58 return fmt.Errorf("--enable-all and --disable-all options must not be combined") 59 } 60 61 if cfg.DisableAll { 62 if len(cfg.Enable) == 0 && len(cfg.Presets) == 0 { 63 return fmt.Errorf("all linters were disabled, but no one linter was enabled: must enable at least one") 64 } 65 66 if len(cfg.Disable) != 0 { 67 return fmt.Errorf("can't combine options --disable-all and --disable %s", cfg.Disable[0]) 68 } 69 } 70 71 if cfg.EnableAll && len(cfg.Enable) != 0 && !cfg.Fast { 72 return fmt.Errorf("can't combine options --enable-all and --enable %s", cfg.Enable[0]) 73 } 74 75 return nil 76 } 77 78 func (v Validator) validateDisabledAndEnabledAtOneMoment(cfg *config.Linters) error { 79 enabledLintersSet := map[string]bool{} 80 for _, name := range cfg.Enable { 81 enabledLintersSet[name] = true 82 } 83 84 for _, name := range cfg.Disable { 85 if enabledLintersSet[name] { 86 return fmt.Errorf("linter %q can't be disabled and enabled at one moment", name) 87 } 88 } 89 90 return nil 91 } 92 93 func (v Validator) validateEnabledDisabledLintersConfig(cfg *config.Linters) error { 94 validators := []func(cfg *config.Linters) error{ 95 v.validateLintersNames, 96 v.validatePresets, 97 v.validateAllDisableEnableOptions, 98 v.validateDisabledAndEnabledAtOneMoment, 99 } 100 for _, v := range validators { 101 if err := v(cfg); err != nil { 102 return err 103 } 104 } 105 106 return nil 107 }