github.com/go-email-validator/go-email-validator@v0.0.0-20230409163946-b8b9e6a0552e/pkg/ev/validator_dep_builder.go (about)

     1  package ev
     2  
     3  import (
     4  	"github.com/emirpasic/gods/sets/hashset"
     5  	"github.com/go-email-validator/go-email-validator/pkg/ev/contains"
     6  	"github.com/go-email-validator/go-email-validator/pkg/ev/disposable"
     7  	"github.com/go-email-validator/go-email-validator/pkg/ev/evsmtp"
     8  	"github.com/go-email-validator/go-email-validator/pkg/ev/role"
     9  )
    10  
    11  // GetDefaultSMTPValidator instantiates default SMTPValidatorName
    12  func GetDefaultSMTPValidator(dto evsmtp.CheckerDTO) Validator {
    13  	return NewWarningsDecorator(
    14  		NewSMTPValidator(evsmtp.NewChecker(dto)),
    15  		NewIsWarning(hashset.New(evsmtp.RandomRCPTStage), func(warningMap WarningSet) IsWarning {
    16  			return func(err error) bool {
    17  				errSMTP, ok := err.(evsmtp.Error)
    18  				if !ok {
    19  					return false
    20  				}
    21  				return warningMap.Contains(errSMTP.Stage())
    22  			}
    23  		}),
    24  	)
    25  }
    26  
    27  // GetDefaultFactories returns default list ValidatorMap
    28  func GetDefaultFactories() ValidatorMap {
    29  	return ValidatorMap{
    30  		RoleValidatorName:       NewRoleValidator(role.NewRBEASetRole()),
    31  		DisposableValidatorName: NewDisposableValidator(contains.NewFunc(disposable.MailChecker)),
    32  		SyntaxValidatorName:     NewSyntaxValidator(),
    33  		MXValidatorName:         DefaultNewMXValidator(),
    34  		SMTPValidatorName:       GetDefaultSMTPValidator(evsmtp.CheckerDTO{}),
    35  	}
    36  }
    37  
    38  // NewDepBuilder instantiates Validator with ValidatorMap or GetDefaultFactories validators
    39  func NewDepBuilder(validators ValidatorMap) *DepBuilder {
    40  	if validators == nil {
    41  		validators = GetDefaultFactories()
    42  	}
    43  
    44  	return &DepBuilder{validators: validators}
    45  }
    46  
    47  // DepBuilder is used to form Validator
    48  type DepBuilder struct {
    49  	validators ValidatorMap
    50  }
    51  
    52  // Set sets validator by ValidatorName
    53  func (d *DepBuilder) Set(name ValidatorName, validator Validator) *DepBuilder {
    54  	d.validators[name] = validator
    55  
    56  	return d
    57  }
    58  
    59  // Get returns validator by ValidatorName
    60  func (d *DepBuilder) Get(name ValidatorName) Validator {
    61  	if d.Has(name) {
    62  		return d.validators[name]
    63  	}
    64  
    65  	return nil
    66  }
    67  
    68  // Has checks for existing validators by ValidatorName...
    69  func (d *DepBuilder) Has(names ...ValidatorName) bool {
    70  	for _, name := range names {
    71  		if _, has := d.validators[name]; !has {
    72  			return false
    73  		}
    74  	}
    75  
    76  	return true
    77  }
    78  
    79  // Delete deletes validators by ValidatorName...
    80  func (d *DepBuilder) Delete(names ...ValidatorName) *DepBuilder {
    81  	for _, name := range names {
    82  		if d.Has(name) {
    83  			delete(d.validators, name)
    84  		}
    85  	}
    86  
    87  	return d
    88  }
    89  
    90  // Build builds Validator based on configuration
    91  func (d *DepBuilder) Build() Validator {
    92  	return NewDepValidator(d.validators)
    93  }