From dccdea1e026edc2bc9c5dc27604e85ce333d65bc Mon Sep 17 00:00:00 2001 From: Ben Burwell Date: Wed, 3 Jul 2019 18:11:33 -0400 Subject: Use []uint32 instead of imap.SeqSet A sequence-set is an IMAP-specific implementation detail. Throughout the UI, aerc simply operates using lists of opaque identifiers. In order to loosen the coupling between the UI and IMAP in particular, replace most usages of imap.SeqSet with []uint32, leaving the translation to a SeqSet to the IMAP backend as needed. --- worker/imap/fetch.go | 14 ++++++-------- worker/imap/flags.go | 6 ++++-- worker/imap/imap.go | 13 +++++++++++++ worker/imap/movecopy.go | 3 ++- 4 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 worker/imap/imap.go (limited to 'worker/imap') diff --git a/worker/imap/fetch.go b/worker/imap/fetch.go index d5bb9aa..fe25977 100644 --- a/worker/imap/fetch.go +++ b/worker/imap/fetch.go @@ -31,8 +31,7 @@ func (imapw *IMAPWorker) handleFetchMessageHeaders( imap.FetchUid, section.FetchItem(), } - - imapw.handleFetchMessages(msg, &msg.Uids, items, section) + imapw.handleFetchMessages(msg, msg.Uids, items, section) } func (imapw *IMAPWorker) handleFetchMessageBodyPart( @@ -46,9 +45,7 @@ func (imapw *IMAPWorker) handleFetchMessageBodyPart( imap.FetchUid, section.FetchItem(), } - uids := imap.SeqSet{} - uids.AddNum(msg.Uid) - imapw.handleFetchMessages(msg, &uids, items, section) + imapw.handleFetchMessages(msg, []uint32{msg.Uid}, items, section) } func (imapw *IMAPWorker) handleFetchFullMessages( @@ -61,11 +58,11 @@ func (imapw *IMAPWorker) handleFetchFullMessages( imap.FetchUid, section.FetchItem(), } - imapw.handleFetchMessages(msg, &msg.Uids, items, section) + imapw.handleFetchMessages(msg, msg.Uids, items, section) } func (imapw *IMAPWorker) handleFetchMessages( - msg types.WorkerMessage, uids *imap.SeqSet, items []imap.FetchItem, + msg types.WorkerMessage, uids []uint32, items []imap.FetchItem, section *imap.BodySectionName) { messages := make(chan *imap.Message) @@ -132,7 +129,8 @@ func (imapw *IMAPWorker) handleFetchMessages( done <- nil }() - if err := imapw.client.UidFetch(uids, items, messages); err != nil { + set := toSeqSet(uids) + if err := imapw.client.UidFetch(set, items, messages); err != nil { imapw.worker.PostMessage(&types.Error{ Message: types.RespondTo(msg), Error: err, diff --git a/worker/imap/flags.go b/worker/imap/flags.go index 0122d8e..57211a6 100644 --- a/worker/imap/flags.go +++ b/worker/imap/flags.go @@ -9,7 +9,8 @@ import ( func (imapw *IMAPWorker) handleDeleteMessages(msg *types.DeleteMessages) { item := imap.FormatFlagsOp(imap.AddFlags, true) flags := []interface{}{imap.DeletedFlag} - if err := imapw.client.UidStore(&msg.Uids, item, flags, nil); err != nil { + uids := toSeqSet(msg.Uids) + if err := imapw.client.UidStore(uids, item, flags, nil); err != nil { imapw.worker.PostMessage(&types.Error{ Message: types.RespondTo(msg), Error: err, @@ -49,7 +50,8 @@ func (imapw *IMAPWorker) handleReadMessages(msg *types.ReadMessages) { item = imap.FormatFlagsOp(imap.RemoveFlags, true) flags = []interface{}{imap.SeenFlag} } - if err := imapw.client.UidStore(&msg.Uids, item, flags, nil); err != nil { + uids := toSeqSet(msg.Uids) + if err := imapw.client.UidStore(uids, item, flags, nil); err != nil { imapw.worker.PostMessage(&types.Error{ Message: types.RespondTo(msg), Error: err, diff --git a/worker/imap/imap.go b/worker/imap/imap.go new file mode 100644 index 0000000..28bac93 --- /dev/null +++ b/worker/imap/imap.go @@ -0,0 +1,13 @@ +package imap + +import ( + "github.com/emersion/go-imap" +) + +func toSeqSet(uids []uint32) *imap.SeqSet { + var set imap.SeqSet + for _, uid := range uids { + set.AddNum(uid) + } + return &set +} diff --git a/worker/imap/movecopy.go b/worker/imap/movecopy.go index 6cf3fe1..b01dab7 100644 --- a/worker/imap/movecopy.go +++ b/worker/imap/movecopy.go @@ -7,7 +7,8 @@ import ( ) func (imapw *IMAPWorker) handleCopyMessages(msg *types.CopyMessages) { - if err := imapw.client.UidCopy(&msg.Uids, msg.Destination); err != nil { + uids := toSeqSet(msg.Uids) + if err := imapw.client.UidCopy(uids, msg.Destination); err != nil { imapw.worker.PostMessage(&types.Error{ Message: types.RespondTo(msg), Error: err, -- cgit v1.2.3