diff --git a/CHANGELOG.md b/CHANGELOG.md index c397b8523..b0d5ac441 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - support `source_code_url` from Webxdc manifests #3314 - support Webxdc document names and add `document` to `dc_msg_get_webxdc_info()` #3317 - improve chat encryption info, make it easier to find contacts without keys #3318 +- improve error reporting when creating a folder fails #3325 ### API-Changes - deprecate unused `marker1before` argument of `dc_get_chat_msgs` diff --git a/src/imap/select_folder.rs b/src/imap/select_folder.rs index 0b8f998f0..70c77ca1e 100644 --- a/src/imap/select_folder.rs +++ b/src/imap/select_folder.rs @@ -1,6 +1,7 @@ use super::Imap; use crate::context::Context; +use anyhow::Context as _; type Result = std::result::Result; @@ -15,8 +16,8 @@ pub enum Error { #[error("IMAP Folder name invalid: {0}")] BadFolderName(String), - #[error("IMAP folder does not exist: {0}")] - NoFolder(String), + #[error("Got a NO response when trying to select {0}, usually this means that it doesn't exist: {1}")] + NoFolder(String, String), #[error("IMAP close/expunge failed")] CloseExpungeFailed(#[from] async_imap::error::Error), @@ -117,8 +118,8 @@ impl Imap { Err(async_imap::error::Error::Validate(_)) => { Err(Error::BadFolderName(folder.to_string())) } - Err(async_imap::error::Error::No(_)) => { - Err(Error::NoFolder(folder.to_string())) + Err(async_imap::error::Error::No(response)) => { + Err(Error::NoFolder(folder.to_string(), response)) } Err(err) => { self.config.selected_folder = None; @@ -139,19 +140,19 @@ impl Imap { &mut self, context: &Context, folder: &str, - ) -> Result { + ) -> anyhow::Result { match self.select_folder(context, Some(folder)).await { Ok(newly_selected) => Ok(newly_selected), Err(err) => match err { - Error::NoFolder(_) => { - if let Some(ref mut session) = self.session { - session.create(folder).await?; - } else { - return Err(Error::NoSession); - } - self.select_folder(context, Some(folder)).await + Error::NoFolder(..) => { + let session = self.session.as_mut().context("no IMAP session")?; + session.create(folder).await.with_context(|| { + format!("Couldn't select folder ('{}'), then create() failed", err) + })?; + + Ok(self.select_folder(context, Some(folder)).await?) } - _ => Err(err), + _ => Err(err.into()), }, } }