about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--commands/msg/reply.go15
-rw-r--r--lib/format/format.go39
-rw-r--r--models/models.go33
-rw-r--r--worker/imap/imap.go7
-rw-r--r--worker/lib/parse.go8
-rw-r--r--worker/lib/sort.go13
6 files changed, 58 insertions, 57 deletions
diff --git a/commands/msg/reply.go b/commands/msg/reply.go
index bde9194..8503979 100644
--- a/commands/msg/reply.go
+++ b/commands/msg/reply.go
@@ -13,6 +13,7 @@ import (
 	"git.sr.ht/~sircmpwn/aerc/lib/format"
 	"git.sr.ht/~sircmpwn/aerc/models"
 	"git.sr.ht/~sircmpwn/aerc/widgets"
+	"github.com/emersion/go-message/mail"
 )
 
 type reply struct{}
@@ -97,8 +98,8 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
 	}
 
 	var (
-		to []*models.Address
-		cc []*models.Address
+		to []*mail.Address
+		cc []*mail.Address
 	)
 
 	recSet := newAddrSet() // used for de-duping
@@ -117,7 +118,7 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
 		// we add our from address, so that we don't self address ourselves
 		recSet.Add(from)
 
-		envTos := make([]*models.Address, 0, len(msg.Envelope.To))
+		envTos := make([]*mail.Address, 0, len(msg.Envelope.To))
 		for _, addr := range msg.Envelope.To {
 			if recSet.Contains(addr) {
 				continue
@@ -147,7 +148,7 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
 	defaults := map[string]string{
 		"To":          format.FormatAddresses(to),
 		"Cc":          format.FormatAddresses(cc),
-		"From":        from.Format(),
+		"From":        format.AddressForHumans(from),
 		"Subject":     subject,
 		"In-Reply-To": msg.Envelope.MessageId,
 	}
@@ -231,17 +232,17 @@ func newAddrSet() addrSet {
 	return addrSet(s)
 }
 
-func (s addrSet) Add(a *models.Address) {
+func (s addrSet) Add(a *mail.Address) {
 	s[a.Address] = struct{}{}
 }
 
-func (s addrSet) AddList(al []*models.Address) {
+func (s addrSet) AddList(al []*mail.Address) {
 	for _, a := range al {
 		s[a.Address] = struct{}{}
 	}
 }
 
-func (s addrSet) Contains(a *models.Address) bool {
+func (s addrSet) Contains(a *mail.Address) bool {
 	_, ok := s[a.Address]
 	return ok
 }
diff --git a/lib/format/format.go b/lib/format/format.go
index 787821a..e19ca31 100644
--- a/lib/format/format.go
+++ b/lib/format/format.go
@@ -2,25 +2,28 @@ package format
 
 import (
 	"errors"
+	"fmt"
 	"mime"
 	gomail "net/mail"
+	"regexp"
 	"strings"
 	"time"
 	"unicode"
 
 	"git.sr.ht/~sircmpwn/aerc/models"
 	"github.com/emersion/go-message"
+	"github.com/emersion/go-message/mail"
 )
 
-func ParseAddress(address string) (*models.Address, error) {
+func ParseAddress(address string) (*mail.Address, error) {
 	addrs, err := gomail.ParseAddress(address)
 	if err != nil {
 		return nil, err
 	}
-	return (*models.Address)(addrs), nil
+	return (*mail.Address)(addrs), nil
 }
 
-func ParseAddressList(s string) ([]*models.Address, error) {
+func ParseAddressList(s string) ([]*mail.Address, error) {
 	if len(s) == 0 {
 		// we don't consider an empty list to be an error
 		return nil, nil
@@ -33,17 +36,35 @@ func ParseAddressList(s string) ([]*models.Address, error) {
 		return nil, err
 	}
 
-	addrs := make([]*models.Address, len(list))
+	addrs := make([]*mail.Address, len(list))
 	for i, a := range list {
-		addrs[i] = (*models.Address)(a)
+		addrs[i] = (*mail.Address)(a)
 	}
 	return addrs, nil
 }
 
-func FormatAddresses(l []*models.Address) string {
+// AddressForHumans formats the address. If the address's name
+// contains non-ASCII characters it will be quoted but not encoded.
+// Meant for display purposes to the humans, not for sending over the wire.
+func AddressForHumans(a *mail.Address) string {
+	if a.Name != "" {
+		if atom.MatchString(a.Name) {
+			return fmt.Sprintf("%s <%s>", a.Name, a.Address)
+		} else {
+			return fmt.Sprintf("\"%s\" <%s>",
+				strings.ReplaceAll(a.Name, "\"", "'"), a.Address)
+		}
+	} else {
+		return fmt.Sprintf("<%s>", a.Address)
+	}
+}
+
+var atom *regexp.Regexp = regexp.MustCompile("^[a-z0-9!#$%7'*+-/=?^_`{}|~ ]+$")
+
+func FormatAddresses(l []*mail.Address) string {
 	formatted := make([]string, len(l))
 	for i, a := range l {
-		formatted[i] = a.Format()
+		formatted[i] = AddressForHumans(a)
 	}
 	return strings.Join(formatted, ", ")
 }
@@ -130,7 +151,7 @@ func ParseMessageFormat(format string, timeFmt string, ctx Ctx) (string,
 				return "", nil,
 					errors.New("no envelope available for this message")
 			}
-			var addr *models.Address
+			var addr *mail.Address
 			if len(envelope.ReplyTo) == 0 {
 				if len(envelope.From) == 0 {
 					return "", nil,
@@ -171,7 +192,7 @@ func ParseMessageFormat(format string, timeFmt string, ctx Ctx) (string,
 				return "", nil,
 					errors.New("found no address for sender")
 			}
-			addr := envelope.From[0].Format()
+			addr := AddressForHumans(envelope.From[0])
 			retval = append(retval, 's')
 			args = append(args, addr)
 		case 'F':
diff --git a/models/models.go b/models/models.go
index a93db72..bfe0ff3 100644
--- a/models/models.go
+++ b/models/models.go
@@ -3,9 +3,6 @@ package models
 import (
 	"fmt"
 	"io"
-	gomail "net/mail"
-	"regexp"
-	"strings"
 	"time"
 
 	"github.com/emersion/go-message/mail"
@@ -127,34 +124,14 @@ func (bs *BodyStructure) PartAtIndex(index []int) (*BodyStructure, error) {
 type Envelope struct {
 	Date      time.Time
 	Subject   string
-	From      []*Address
-	ReplyTo   []*Address
-	To        []*Address
-	Cc        []*Address
-	Bcc       []*Address
+	From      []*mail.Address
+	ReplyTo   []*mail.Address
+	To        []*mail.Address
+	Cc        []*mail.Address
+	Bcc       []*mail.Address
 	MessageId string
 }
 
-type Address gomail.Address
-
-var atom *regexp.Regexp = regexp.MustCompile("^[a-z0-9!#$%7'*+-/=?^_`{}|~ ]+$")
-
-// String formats the address. If the address's name
-// contains non-ASCII characters it will be quoted but not encoded.
-// Meant for display purposes to the humans, not for sending over the wire.
-func (a *Address) Format() string {
-	if a.Name != "" {
-		if atom.MatchString(a.Name) {
-			return fmt.Sprintf("%s <%s>", a.Name, a.Address)
-		} else {
-			return fmt.Sprintf("\"%s\" <%s>",
-				strings.ReplaceAll(a.Name, "\"", "'"), a.Address)
-		}
-	} else {
-		return fmt.Sprintf("<%s>", a.Address)
-	}
-}
-
 // OriginalMail is helper struct used for reply/forward
 type OriginalMail struct {
 	Date     time.Time
diff --git a/worker/imap/imap.go b/worker/imap/imap.go
index aa1854d..e296e9b 100644
--- a/worker/imap/imap.go
+++ b/worker/imap/imap.go
@@ -5,6 +5,7 @@ import (
 
 	"git.sr.ht/~sircmpwn/aerc/models"
 	"github.com/emersion/go-message/charset"
+	"github.com/emersion/go-message/mail"
 )
 
 func init() {
@@ -59,10 +60,10 @@ func translateEnvelope(e *imap.Envelope) *models.Envelope {
 	}
 }
 
-func translateAddresses(addrs []*imap.Address) []*models.Address {
-	var converted []*models.Address
+func translateAddresses(addrs []*imap.Address) []*mail.Address {
+	var converted []*mail.Address
 	for _, addr := range addrs {
-		converted = append(converted, &models.Address{
+		converted = append(converted, &mail.Address{
 			Name:    addr.PersonalName,
 			Address: addr.Address(),
 		})
diff --git a/worker/lib/parse.go b/worker/lib/parse.go
index edd3649..9fa539f 100644
--- a/worker/lib/parse.go
+++ b/worker/lib/parse.go
@@ -193,19 +193,19 @@ func parseReceivedHeader(h *mail.Header) (time.Time, error) {
 	return time.Parse(time.RFC1123Z, dateRe.FindString(guess))
 }
 
-func parseAddressList(h *mail.Header, key string) ([]*models.Address, error) {
-	var converted []*models.Address
+func parseAddressList(h *mail.Header, key string) ([]*mail.Address, error) {
+	var converted []*mail.Address
 	addrs, err := h.AddressList(key)
 	if err != nil {
 		if hdr, err := h.Text(key); err == nil {
-			return []*models.Address{&models.Address{
+			return []*mail.Address{&mail.Address{
 				Name: hdr,
 			}}, nil
 		}
 		return nil, err
 	}
 	for _, addr := range addrs {
-		converted = append(converted, &models.Address{
+		converted = append(converted, &mail.Address{
 			Name:    addr.Name,
 			Address: addr.Address,
 		})
diff --git a/worker/lib/sort.go b/worker/lib/sort.go
index 9d1f50a..09bcf77 100644
--- a/worker/lib/sort.go
+++ b/worker/lib/sort.go
@@ -6,6 +6,7 @@ import (
 
 	"git.sr.ht/~sircmpwn/aerc/models"
 	"git.sr.ht/~sircmpwn/aerc/worker/types"
+	"github.com/emersion/go-message/mail"
 )
 
 func Sort(messageInfos []*models.MessageInfo,
@@ -20,7 +21,7 @@ func Sort(messageInfos []*models.MessageInfo,
 			})
 		case types.SortCc:
 			sortAddresses(messageInfos, criterion,
-				func(msgInfo *models.MessageInfo) []*models.Address {
+				func(msgInfo *models.MessageInfo) []*mail.Address {
 					return msgInfo.Envelope.Cc
 				})
 		case types.SortDate:
@@ -29,7 +30,7 @@ func Sort(messageInfos []*models.MessageInfo,
 			})
 		case types.SortFrom:
 			sortAddresses(messageInfos, criterion,
-				func(msgInfo *models.MessageInfo) []*models.Address {
+				func(msgInfo *models.MessageInfo) []*mail.Address {
 					return msgInfo.Envelope.From
 				})
 		case types.SortRead:
@@ -47,7 +48,7 @@ func Sort(messageInfos []*models.MessageInfo,
 				})
 		case types.SortTo:
 			sortAddresses(messageInfos, criterion,
-				func(msgInfo *models.MessageInfo) []*models.Address {
+				func(msgInfo *models.MessageInfo) []*mail.Address {
 					return msgInfo.Envelope.To
 				})
 		}
@@ -61,10 +62,10 @@ func Sort(messageInfos []*models.MessageInfo,
 }
 
 func sortAddresses(messageInfos []*models.MessageInfo, criterion *types.SortCriterion,
-	getValue func(*models.MessageInfo) []*models.Address) {
+	getValue func(*models.MessageInfo) []*mail.Address) {
 	sortSlice(criterion, messageInfos, func(i, j int) bool {
 		addressI, addressJ := getValue(messageInfos[i]), getValue(messageInfos[j])
-		var firstI, firstJ *models.Address
+		var firstI, firstJ *mail.Address
 		if len(addressI) > 0 {
 			firstI = addressI[0]
 		}
@@ -78,7 +79,7 @@ func sortAddresses(messageInfos []*models.MessageInfo, criterion *types.SortCrit
 		} else if firstI != nil && firstJ == nil {
 			return true
 		} else /* firstI != nil && firstJ != nil */ {
-			getName := func(addr *models.Address) string {
+			getName := func(addr *mail.Address) string {
 				if addr.Name != "" {
 					return addr.Name
 				} else {