diff options
author | Robin Jarry <robin@jarry.cc> | 2023-10-17 15:31:09 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2023-10-28 19:24:59 +0200 |
commit | 8464b373851142b0becaaa10db34df3559b2b62e (patch) | |
tree | dd785d6c717f1e620c63252348d8add991587a57 /worker/imap/open.go | |
parent | 57088312fdd8e602a084bd5736a0e22a34be9ec0 (diff) | |
download | aerc-8464b373851142b0becaaa10db34df3559b2b62e.tar.gz |
search: use a common api for all workers
Define a SearchCriteria structure. Update the FetchDirectoryContents,
FetchDirectoryThreaded and SearchDirectory worker messages to include
this SearchCriteria structure instead of a []string slice.
Parse the search arguments in a single place into a SearchCriteria
structure and use it to search/filter via the message store.
Update all workers to use that new API. Clarify the man page indicating
that notmuch supports searching with aerc's syntax and also with notmuch
specific syntax.
getopt is no longer needed, remove it from go.mod.
NB: to support more complex search filters in JMAP, we need to use an
email.Filter interface. Since GOB does not support encoding/decoding
interfaces, store the raw SearchCriteria and []SortCriterion values in
the cached FolderContents. Translate them to JMAP API objects when
sending an email.Query request to the server.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Reviewed-by: Koni Marti <koni.marti@gmail.com>
Tested-by: Moritz Poldrack <moritz@poldrack.dev>
Tested-by: Inwit <inwit@sindominio.net>
Diffstat (limited to 'worker/imap/open.go')
-rw-r--r-- | worker/imap/open.go | 23 |
1 files changed, 5 insertions, 18 deletions
diff --git a/worker/imap/open.go b/worker/imap/open.go index 693d93a9..355709a7 100644 --- a/worker/imap/open.go +++ b/worker/imap/open.go @@ -39,17 +39,11 @@ func (imapw *IMAPWorker) handleFetchDirectoryContents( } imapw.worker.Tracef("Fetching UID list") - searchCriteria, err := parseSearch(msg.FilterCriteria) - if err != nil { - imapw.worker.PostMessage(&types.Error{ - Message: types.RespondTo(msg), - Error: err, - }, nil) - return - } + searchCriteria := translateSearch(msg.Filter) sortCriteria := translateSortCriterions(msg.SortCriteria) hasSortCriteria := len(sortCriteria) > 0 + var err error var uids []uint32 // If the server supports the SORT extension, do the sorting server side @@ -87,7 +81,7 @@ func (imapw *IMAPWorker) handleFetchDirectoryContents( return } imapw.worker.Tracef("Found %d UIDs", len(uids)) - if len(msg.FilterCriteria) == 1 { + if msg.Filter == nil { // Only initialize if we are not filtering imapw.seqMap.Initialize(uids) } @@ -134,14 +128,7 @@ func (imapw *IMAPWorker) handleDirectoryThreaded( } imapw.worker.Tracef("Fetching threaded UID list") - searchCriteria, err := parseSearch(msg.FilterCriteria) - if err != nil { - imapw.worker.PostMessage(&types.Error{ - Message: types.RespondTo(msg), - Error: err, - }, nil) - return - } + searchCriteria := translateSearch(msg.Filter) threads, err := imapw.client.thread.UidThread(imapw.threadAlgorithm, searchCriteria) if err != nil { @@ -154,7 +141,7 @@ func (imapw *IMAPWorker) handleDirectoryThreaded( aercThreads, count := convertThreads(threads, nil) sort.Sort(types.ByUID(aercThreads)) imapw.worker.Tracef("Found %d threaded messages", count) - if len(msg.FilterCriteria) == 1 { + if msg.Filter == nil { // Only initialize if we are not filtering var uids []uint32 for i := len(aercThreads) - 1; i >= 0; i-- { |