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  }