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 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`

View File

@@ -1,6 +1,7 @@
use super::Imap;
use crate::context::Context;
use anyhow::Context as _;
type Result<T> = std::result::Result<T, Error>;
@@ -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<NewlySelected> {
) -> anyhow::Result<NewlySelected> {
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()),
},
}
}