github.com/go-email-validator/go-email-validator@v0.0.0-20230409163946-b8b9e6a0552e/pkg/ev/evmail/email.go (about) 1 package evmail 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 const ( 9 // AT store at symbol 10 AT = "@" 11 ) 12 13 // Address represents email 14 type Address interface { 15 Username() string 16 Domain() string 17 fmt.Stringer 18 } 19 20 // NewEmailAddress forms Address from username and domain 21 func NewEmailAddress(username, domain string) Address { 22 return NewEmailAddressWithSource(username, domain, username+AT+domain) 23 } 24 25 // NewEmailAddressWithSource forms Address 26 // source used to store empty emails or without username or domain part 27 func NewEmailAddressWithSource(username, domain, source string) Address { 28 username = strings.ToLower(username) 29 domain = strings.ToLower(domain) 30 source = strings.ToLower(source) 31 32 return address{ 33 username: username, 34 domain: domain, 35 source: source, 36 } 37 } 38 39 type address struct { 40 username string 41 domain string 42 source string 43 } 44 45 func (e address) Username() string { 46 return e.username 47 } 48 49 func (e address) Domain() string { 50 return e.domain 51 } 52 53 func (e address) String() string { 54 return e.source 55 } 56 57 // SeparateEmail separates email by "@" and returns two parts 58 func SeparateEmail(email string) (string, string) { 59 pos := strings.IndexByte(email, '@') 60 61 if pos == -1 || len(email) < 3 { 62 return "", "" 63 } 64 65 return email[:pos], email[pos+1:] 66 } 67 68 // FromString forms Address from string 69 func FromString(email string) Address { 70 username, domain := SeparateEmail(email) 71 72 return NewEmailAddressWithSource(username, domain, email) 73 } 74 75 // EmptyEmail return defaultVal if val is nil 76 func EmptyEmail(val Address, defaultVal Address) Address { 77 if val == nil { 78 return defaultVal 79 } 80 81 return val 82 }