remove models.Address in favor of go-message Address

We made a new type out of go-message/mail.Address without any real reason.
This suddenly made it necessary to convert from one to the other without actually
having any benefit whatsoever.
This commit gets rid of the additional type
This commit is contained in:
Reto Brunner 2020-11-10 19:57:09 +01:00
parent fb67d1f5a3
commit fc9ccc3000
6 changed files with 58 additions and 57 deletions

View File

@ -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
}

View File

@ -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':

View File

@ -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

View File

@ -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(),
})

View File

@ -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,
})

View File

@ -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 {