diff --git a/src/download.rs b/src/download.rs index e3770477d..1d031a81e 100644 --- a/src/download.rs +++ b/src/download.rs @@ -3,13 +3,13 @@ use std::cmp::max; use std::collections::BTreeMap; -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, bail, Result}; use deltachat_derive::{FromSql, ToSql}; use serde::{Deserialize, Serialize}; use crate::config::Config; use crate::context::Context; -use crate::imap::{session::Session, ImapActionResult}; +use crate::imap::session::Session; use crate::message::{Message, MsgId, Viewtype}; use crate::mimeparser::{MimeMessage, Part}; use crate::tools::time; @@ -154,7 +154,7 @@ pub(crate) async fn download_msg( return Err(anyhow!("Call download_full() again to try over.")); }; - match session + session .fetch_single_msg( context, &server_folder, @@ -162,13 +162,8 @@ pub(crate) async fn download_msg( server_uid, msg.rfc724_mid.clone(), ) - .await - { - ImapActionResult::RetryLater | ImapActionResult::Failed => { - Err(anyhow!("Call download_full() again to try over.")) - } - ImapActionResult::Success => Ok(()), - } + .await?; + Ok(()) } impl Session { @@ -183,20 +178,19 @@ impl Session { uidvalidity: u32, uid: u32, rfc724_mid: String, - ) -> ImapActionResult { - if let Some(imapresult) = self - .prepare_imap_operation_on_msg(context, folder, uid) - .await - { - return imapresult; + ) -> Result<()> { + if uid == 0 { + bail!("Attempt to fetch UID 0"); } + self.select_folder(context, Some(folder)).await?; + // we are connected, and the folder is selected info!(context, "Downloading message {}/{} fully...", folder, uid); let mut uid_message_ids: BTreeMap = BTreeMap::new(); uid_message_ids.insert(uid, rfc724_mid); - let (last_uid, _received) = match self + let (last_uid, _received) = self .fetch_many_msgs( context, folder, @@ -206,16 +200,11 @@ impl Session { false, false, ) - .await - { - Ok(res) => res, - Err(_) => return ImapActionResult::Failed, - }; + .await?; if last_uid.is_none() { - ImapActionResult::Failed - } else { - ImapActionResult::Success + bail!("Failed to fetch UID {uid}"); } + Ok(()) } } diff --git a/src/imap.rs b/src/imap.rs index dc2f0e152..83432bae5 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -54,13 +54,6 @@ use session::Session; pub(crate) const GENERATED_PREFIX: &str = "GEN_"; -#[derive(Debug, Display, Clone, Copy, PartialEq, Eq)] -pub enum ImapActionResult { - Failed, - RetryLater, - Success, -} - const RFC724MID_UID: &str = "(UID BODY.PEEK[HEADER.FIELDS (\ MESSAGE-ID \ X-MICROSOFT-ORIGINAL-MESSAGE-ID\ @@ -1475,33 +1468,6 @@ impl Session { Ok(()) } - pub(crate) async fn prepare_imap_operation_on_msg( - &mut self, - context: &Context, - folder: &str, - uid: u32, - ) -> Option { - if uid == 0 { - return Some(ImapActionResult::RetryLater); - } - - match self.select_folder(context, Some(folder)).await { - Ok(_) => None, - Err(select_folder::Error::ConnectionLost) => { - warn!(context, "Lost imap connection"); - Some(ImapActionResult::RetryLater) - } - Err(select_folder::Error::BadFolderName(folder_name)) => { - warn!(context, "invalid folder name: {:?}", folder_name); - Some(ImapActionResult::Failed) - } - Err(err) => { - warn!(context, "failed to select folder {:?}: {:#}", folder, err); - Some(ImapActionResult::RetryLater) - } - } - } - /// Attempts to configure mvbox. /// /// Tries to find any folder in the given list of `folders`. If none is found, tries to create diff --git a/src/imap/select_folder.rs b/src/imap/select_folder.rs index e340404ea..45c85a7e1 100644 --- a/src/imap/select_folder.rs +++ b/src/imap/select_folder.rs @@ -52,7 +52,7 @@ impl ImapSession { /// Selects a folder, possibly updating uid_validity and, if needed, /// expunging the folder to remove delete-marked messages. /// Returns whether a new folder was selected. - pub(super) async fn select_folder( + pub(crate) async fn select_folder( &mut self, context: &Context, folder: Option<&str>, @@ -256,7 +256,7 @@ impl ImapSession { } #[derive(PartialEq, Debug, Copy, Clone, Eq)] -pub(super) enum NewlySelected { +pub(crate) enum NewlySelected { /// The folder was newly selected during this call to select_folder(). Yes, /// No SELECT command was run because the folder already was selected