aboutsummaryrefslogtreecommitdiff
path: root/src/imap
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2024-01-11 11:55:40 +0100
committerQuentin Dufour <quentin@deuxfleurs.fr>2024-01-11 11:55:40 +0100
commita9d33c67080fd08b057501c36a07fade351bd83d (patch)
treea499d27f24db85811a39ec513ef7708eed2151f1 /src/imap
parentfbf2e9aa9670c991f5384350b2c78ad38dc3baf8 (diff)
downloadaerogramme-a9d33c67080fd08b057501c36a07fade351bd83d.tar.gz
aerogramme-a9d33c67080fd08b057501c36a07fade351bd83d.zip
MODSEQ is now returned on non empty search results
Diffstat (limited to 'src/imap')
-rw-r--r--src/imap/mailbox_view.rs13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/imap/mailbox_view.rs b/src/imap/mailbox_view.rs
index ecdd745..9e9e785 100644
--- a/src/imap/mailbox_view.rs
+++ b/src/imap/mailbox_view.rs
@@ -1,4 +1,4 @@
-use std::num::NonZeroU32;
+use std::num::{NonZeroU32, NonZeroU64};
use std::sync::Arc;
use anyhow::{anyhow, Error, Result};
@@ -348,7 +348,7 @@ impl MailboxView {
// 6. Format the result according to the client's taste:
// either return UID or ID.
- let final_selection = kept_idx.into_iter().chain(kept_query.into_iter());
+ let final_selection = kept_idx.iter().chain(kept_query.iter());
let selection_fmt = match uid {
true => final_selection.map(|in_idx| in_idx.uid).collect(),
_ => final_selection.map(|in_idx| in_idx.i).collect(),
@@ -356,8 +356,15 @@ impl MailboxView {
// 7. Add the modseq entry if needed
let is_modseq = crit.is_modseq();
+ let maybe_modseq = match is_modseq {
+ true => {
+ let final_selection = kept_idx.iter().chain(kept_query.iter());
+ final_selection.map(|in_idx| in_idx.modseq).max().map(|r| NonZeroU64::try_from(r)).transpose()?
+ },
+ _ => None,
+ };
- Ok((vec![Body::Data(Data::Search(selection_fmt))], is_modseq))
+ Ok((vec![Body::Data(Data::Search(selection_fmt, maybe_modseq))], is_modseq))
}
// ----