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  }