package merrors import ( "errors" "strings" ) const ( SignupEmailPolicyCode = "signup_email_rejected" SignupEmailPolicyReasonInvalidEmail = "invalid_email" SignupEmailPolicyReasonDisposableDomain = "disposable_domain" SignupEmailPolicyReasonFreeDomain = "free_domain" ) var ErrSignupEmailPolicyRejected = Define(SignupEmailPolicyCode) type SignupEmailPolicyError struct { reason string domain string } func NormalizeSignupEmailPolicyReason(reason string) string { switch strings.TrimSpace(reason) { case SignupEmailPolicyReasonInvalidEmail: return SignupEmailPolicyReasonInvalidEmail case SignupEmailPolicyReasonDisposableDomain: return SignupEmailPolicyReasonDisposableDomain case SignupEmailPolicyReasonFreeDomain: return SignupEmailPolicyReasonFreeDomain default: return SignupEmailPolicyReasonInvalidEmail } } func IsSignupEmailPolicyReason(reason string) bool { return strings.TrimSpace(reason) == NormalizeSignupEmailPolicyReason(reason) } func (e *SignupEmailPolicyError) Error() string { if e == nil || e.reason == "" { return SignupEmailPolicyCode } return SignupEmailPolicyCode + ": " + e.reason } func (e *SignupEmailPolicyError) Unwrap() error { return ErrSignupEmailPolicyRejected } func (e *SignupEmailPolicyError) Reason() string { if e == nil { return "" } return strings.TrimSpace(e.reason) } func (e *SignupEmailPolicyError) Domain() string { if e == nil { return "" } return strings.TrimSpace(e.domain) } func SignupEmailPolicyRejected(reason, domain string) error { return &SignupEmailPolicyError{ reason: NormalizeSignupEmailPolicyReason(reason), domain: strings.TrimSpace(domain), } } func AsSignupEmailPolicyError(err error) (*SignupEmailPolicyError, bool) { var policyErr *SignupEmailPolicyError if errors.As(err, &policyErr) && policyErr != nil { return policyErr, true } return nil, false }