Better error reporting when creating a folder fails (#3325)

Fixes #3310
This commit is contained in:
Hocuri
2022-05-17 10:40:44 +02:00
committed by GitHub
parent 99f8785475
commit 88b470e8e5
2 changed files with 15 additions and 13 deletions

View File

@@ -8,6 +8,7 @@
- support `source_code_url` from Webxdc manifests #3314 - support `source_code_url` from Webxdc manifests #3314
- support Webxdc document names and add `document` to `dc_msg_get_webxdc_info()` #3317 - 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 chat encryption info, make it easier to find contacts without keys #3318
- improve error reporting when creating a folder fails #3325
### API-Changes ### API-Changes
- deprecate unused `marker1before` argument of `dc_get_chat_msgs` - deprecate unused `marker1before` argument of `dc_get_chat_msgs`

View File

@@ -1,6 +1,7 @@
use super::Imap; use super::Imap;
use crate::context::Context; use crate::context::Context;
use anyhow::Context as _;
type Result<T> = std::result::Result<T, Error>; type Result<T> = std::result::Result<T, Error>;
@@ -15,8 +16,8 @@ pub enum Error {
#[error("IMAP Folder name invalid: {0}")] #[error("IMAP Folder name invalid: {0}")]
BadFolderName(String), BadFolderName(String),
#[error("IMAP folder does not exist: {0}")] #[error("Got a NO response when trying to select {0}, usually this means that it doesn't exist: {1}")]
NoFolder(String), NoFolder(String, String),
#[error("IMAP close/expunge failed")] #[error("IMAP close/expunge failed")]
CloseExpungeFailed(#[from] async_imap::error::Error), CloseExpungeFailed(#[from] async_imap::error::Error),
@@ -117,8 +118,8 @@ impl Imap {
Err(async_imap::error::Error::Validate(_)) => { Err(async_imap::error::Error::Validate(_)) => {
Err(Error::BadFolderName(folder.to_string())) Err(Error::BadFolderName(folder.to_string()))
} }
Err(async_imap::error::Error::No(_)) => { Err(async_imap::error::Error::No(response)) => {
Err(Error::NoFolder(folder.to_string())) Err(Error::NoFolder(folder.to_string(), response))
} }
Err(err) => { Err(err) => {
self.config.selected_folder = None; self.config.selected_folder = None;
@@ -139,19 +140,19 @@ impl Imap {
&mut self, &mut self,
context: &Context, context: &Context,
folder: &str, folder: &str,
) -> Result<NewlySelected> { ) -> anyhow::Result<NewlySelected> {
match self.select_folder(context, Some(folder)).await { match self.select_folder(context, Some(folder)).await {
Ok(newly_selected) => Ok(newly_selected), Ok(newly_selected) => Ok(newly_selected),
Err(err) => match err { Err(err) => match err {
Error::NoFolder(_) => { Error::NoFolder(..) => {
if let Some(ref mut session) = self.session { let session = self.session.as_mut().context("no IMAP session")?;
session.create(folder).await?; session.create(folder).await.with_context(|| {
} else { format!("Couldn't select folder ('{}'), then create() failed", err)
return Err(Error::NoSession); })?;
}
self.select_folder(context, Some(folder)).await Ok(self.select_folder(context, Some(folder)).await?)
} }
_ => Err(err), _ => Err(err.into()),
}, },
} }
} }