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 }