Status now returns UNSEEN

This commit is contained in:
Quentin 2024-01-08 15:07:02 +01:00
parent 0acbbe66c1
commit 8b5eb25c0c
Signed by: quentin
GPG key ID: E9602264D639FF68
2 changed files with 30 additions and 4 deletions

View file

@ -74,7 +74,12 @@ impl<'a> MailView<'a> {
MessageDataItemName::Rfc822Size => self.rfc_822_size(), MessageDataItemName::Rfc822Size => self.rfc_822_size(),
MessageDataItemName::Rfc822Header => self.rfc_822_header(), MessageDataItemName::Rfc822Header => self.rfc_822_header(),
MessageDataItemName::Rfc822Text => self.rfc_822_text(), MessageDataItemName::Rfc822Text => self.rfc_822_text(),
MessageDataItemName::Rfc822 => self.rfc822(), MessageDataItemName::Rfc822 => {
if self.is_not_yet_seen() {
seen = SeenFlag::MustAdd;
}
self.rfc822()
},
MessageDataItemName::Envelope => Ok(self.envelope()), MessageDataItemName::Envelope => Ok(self.envelope()),
MessageDataItemName::Body => self.body(), MessageDataItemName::Body => self.body(),
MessageDataItemName::BodyStructure => self.body_structure(), MessageDataItemName::BodyStructure => self.body_structure(),
@ -189,6 +194,11 @@ impl<'a> MailView<'a> {
)?)) )?))
} }
fn is_not_yet_seen(&self) -> bool {
let seen_flag = Flag::Seen.to_string();
!self.in_idx.flags.iter().any(|x| *x == seen_flag)
}
/// maps to BODY[<section>]<<partial>> and BODY.PEEK[<section>]<<partial>> /// maps to BODY[<section>]<<partial>> and BODY.PEEK[<section>]<<partial>>
/// peek does not implicitly set the \Seen flag /// peek does not implicitly set the \Seen flag
/// eg. BODY[HEADER.FIELDS (DATE FROM)] /// eg. BODY[HEADER.FIELDS (DATE FROM)]
@ -201,8 +211,7 @@ impl<'a> MailView<'a> {
) -> Result<(MessageDataItem<'static>, SeenFlag)> { ) -> Result<(MessageDataItem<'static>, SeenFlag)> {
// Manage Seen flag // Manage Seen flag
let mut seen = SeenFlag::DoNothing; let mut seen = SeenFlag::DoNothing;
let seen_flag = Flag::Seen.to_string(); if !peek && self.is_not_yet_seen() {
if !peek && !self.in_idx.flags.iter().any(|x| *x == seen_flag) {
// Add \Seen flag // Add \Seen flag
//self.mailbox.add_flags(uuid, &[seen_flag]).await?; //self.mailbox.add_flags(uuid, &[seen_flag]).await?;
seen = SeenFlag::MustAdd; seen = SeenFlag::MustAdd;

View file

@ -1,7 +1,7 @@
use std::num::NonZeroU32; use std::num::NonZeroU32;
use std::sync::Arc; use std::sync::Arc;
use anyhow::{anyhow, Error, Result}; use anyhow::{anyhow, Error, Context, Result};
use futures::stream::{FuturesOrdered, StreamExt}; use futures::stream::{FuturesOrdered, StreamExt};
@ -130,6 +130,7 @@ impl MailboxView {
data.extend(self.flags_status()?.into_iter()); data.extend(self.flags_status()?.into_iter());
data.push(self.uidvalidity_status()?); data.push(self.uidvalidity_status()?);
data.push(self.uidnext_status()?); data.push(self.uidnext_status()?);
self.unseen_first_status()?.map(|unseen_status| data.push(unseen_status));
Ok(data) Ok(data)
} }
@ -400,6 +401,22 @@ impl MailboxView {
Ok(Body::Data(Data::Recent(self.recent()?))) Ok(Body::Data(Data::Recent(self.recent()?)))
} }
fn unseen_first_status(&self) -> Result<Option<Body<'static>>> {
Ok(self.unseen_first()?.map(|unseen_id| {
Status::ok(None, Some(Code::Unseen(unseen_id)), "First unseen.").map(Body::Status)
}).transpose()?)
}
fn unseen_first(&self) -> Result<Option<NonZeroU32>> {
Ok(self.0.snapshot.table
.values()
.enumerate()
.find(|(_i, (_imap_uid, flags))| {
!flags.contains(&"\\Seen".to_string())
}).map(|(i, _)| NonZeroU32::try_from(i as u32 + 1))
.transpose()?)
}
pub(crate) fn recent(&self) -> Result<u32> { pub(crate) fn recent(&self) -> Result<u32> {
let recent = self let recent = self
.0 .0