use super::defs::*;
use crate::{account::model::*, support::error::Error};
impl Account {
pub fn probe_mailbox(&mut self, mailbox: &str) -> Result<(), Error> {
let mailbox_id = self.metadb.find_mailbox(mailbox)?;
if !self.metadb.fetch_mailbox(mailbox_id)?.selectable {
return Err(Error::MailboxUnselectable);
}
Ok(())
}
pub fn select(
&mut self,
mailbox: &str,
writable: bool,
qresync: Option<&QresyncRequest>,
) -> Result<(Mailbox, Option<QresyncResponse>), Error> {
self.drain_deliveries();
let mailbox_id = self.metadb.find_mailbox(mailbox)?;
let snapshot = self.metadb.select(mailbox_id, writable, qresync)?;
let mailbox = Mailbox {
id: mailbox_id,
writable,
messages: snapshot
.messages
.into_iter()
.map(MessageStatus::from)
.collect(),
max_client_known_flag_id: snapshot
.flags
.last()
.expect("there is always at least one flag")
.0,
flags: snapshot.flags,
snapshot_modseq: snapshot.max_modseq,
polled_snapshot_modseq: snapshot.max_modseq,
has_pending_expunge: false,
next_uid: snapshot.next_uid,
changed_flags_uids: Vec::new(),
fetch_loopbreaker: Default::default(),
};
Ok((mailbox, snapshot.qresync))
}
}
impl Mailbox {
pub fn select_response(&self) -> Result<SelectResponse, Error> {
let seen_flag =
self.flag_id(&Flag::Seen).expect("\\Seen is always defined");
Ok(SelectResponse {
flags: self
.flags
.iter()
.map(|&(_, ref flag)| flag.clone())
.collect(),
exists: self.messages.len(),
recent: self.messages.iter().filter(|m| m.recent).count(),
unseen: self
.messages
.iter()
.position(|m| !m.flags.contains(seen_flag.0))
.map(Seqnum::from_index),
uidnext: self.next_uid,
uidvalidity: self.id.as_uid_validity()?,
read_only: !self.writable,
max_modseq: self.snapshot_modseq,
})
}
}