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

     1  package ev
     2  
     3  import (
     4  	"github.com/go-email-validator/go-email-validator/pkg/ev/utils"
     5  	"net/mail"
     6  	"regexp"
     7  )
     8  
     9  // SyntaxValidatorName is name of syntax validator
    10  const SyntaxValidatorName ValidatorName = "syntaxValidator"
    11  
    12  // SyntaxErr is text for SyntaxError.Error
    13  const SyntaxErr = "SyntaxErr"
    14  
    15  // SyntaxError is error of SyntaxValidatorName
    16  type SyntaxError struct{}
    17  
    18  func (SyntaxError) Error() string {
    19  	return SyntaxErr
    20  }
    21  
    22  // SyntaxValidatorResult is interface of SyntaxValidatorName result
    23  type SyntaxValidatorResult interface {
    24  	ValidationResult
    25  }
    26  
    27  // NewSyntaxValidator instantiates SyntaxValidatorName based on mail.ParseAddress
    28  func NewSyntaxValidator() Validator {
    29  	return syntaxValidator{}
    30  }
    31  
    32  type syntaxValidator struct {
    33  	AValidatorWithoutDeps
    34  }
    35  
    36  func (syntaxValidator) Validate(input Input, _ ...ValidationResult) ValidationResult {
    37  	_, err := mail.ParseAddress(input.Email().String())
    38  
    39  	if err == nil {
    40  		return NewValidResult(SyntaxValidatorName)
    41  	}
    42  	return syntaxGetError()
    43  }
    44  
    45  func syntaxGetError() ValidationResult {
    46  	return NewResult(false, utils.Errs(SyntaxError{}), nil, SyntaxValidatorName)
    47  }
    48  
    49  var defaultEmailRegex = regexp.MustCompile("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])")
    50  
    51  // NewSyntaxRegexValidator creates SyntaxValidatorName, based on *regexp.Regexp
    52  // Example of regular expressions
    53  // HTML5 - https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address
    54  // Different variations - http://emailregex.com/, RFC 5322 is used as default emailRegex
    55  func NewSyntaxRegexValidator(emailRegex *regexp.Regexp) Validator {
    56  	if emailRegex == nil {
    57  		emailRegex = defaultEmailRegex
    58  	}
    59  
    60  	return syntaxRegexValidator{
    61  		emailRegex: emailRegex,
    62  	}
    63  }
    64  
    65  type syntaxRegexValidator struct {
    66  	AValidatorWithoutDeps
    67  	emailRegex *regexp.Regexp
    68  }
    69  
    70  func (s syntaxRegexValidator) Validate(input Input, _ ...ValidationResult) ValidationResult {
    71  	if s.emailRegex.MatchString(input.Email().String()) {
    72  		return NewValidResult(SyntaxValidatorName)
    73  	}
    74  	return syntaxGetError()
    75  }