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  }