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