github.com/go-email-validator/go-email-validator@v0.0.0-20230409163946-b8b9e6a0552e/pkg/ev/validator_mx.go (about) 1 package ev 2 3 import ( 4 "github.com/go-email-validator/go-email-validator/pkg/ev/evsmtp" 5 "github.com/go-email-validator/go-email-validator/pkg/ev/utils" 6 ) 7 8 // MXValidatorName is name of mx validator 9 const MXValidatorName ValidatorName = "MXValidator" 10 11 // EmptyMXsError is error of MXValidatorName 12 type EmptyMXsError struct{} 13 14 func (EmptyMXsError) Error() string { 15 return "EmptyMXsError" 16 } 17 18 // MXValidationResult is result of MXValidatorName 19 type MXValidationResult interface { 20 MX() evsmtp.MXs 21 ValidationResult 22 } 23 24 // NewMXValidationResult instantiates result of MXValidatorName 25 func NewMXValidationResult(mx evsmtp.MXs, result *AValidationResult) MXValidationResult { 26 return mxValidationResult{mx: mx, AValidationResult: result} 27 } 28 29 type mxValidationResult struct { 30 *AValidationResult 31 mx evsmtp.MXs 32 } 33 34 func (v mxValidationResult) MX() evsmtp.MXs { 35 return v.mx 36 } 37 38 // DefaultNewMXValidator instantiates default MXValidatorName based on evsmtp.LookupMX 39 func DefaultNewMXValidator() Validator { 40 return NewMXValidator(evsmtp.LookupMX) 41 } 42 43 // NewMXValidator instantiates MXValidatorName based on evsmtp.FuncLookupMX 44 func NewMXValidator(lookupMX evsmtp.FuncLookupMX) Validator { 45 return mxValidator{ 46 lookupMX: lookupMX, 47 } 48 } 49 50 type mxValidator struct { 51 AValidatorWithoutDeps 52 lookupMX evsmtp.FuncLookupMX 53 } 54 55 func (v mxValidator) Validate(input Input, _ ...ValidationResult) ValidationResult { 56 var mxs evsmtp.MXs 57 var err error 58 mxs, err = v.lookupMX(input.Email().Domain()) 59 60 if hasMXs := len(mxs) > 0; err == nil && !hasMXs { 61 err = EmptyMXsError{} 62 } 63 64 return NewMXValidationResult( 65 mxs, 66 NewResult(err == nil, utils.Errs(err), nil, MXValidatorName).(*AValidationResult), 67 ) 68 }