1use std::{any::Any, result};
2
3use thiserror::Error;
4use tokio::task::JoinError;
5
6use crate::{AnyBoxedError, AnyError};
7
8pub type Result<T> = result::Result<T, Error>;
10
11#[derive(Debug, Error)]
13pub enum Error {
14 #[cfg(feature = "maildir")]
15 #[error("cannot create maildir folder structure at {1}")]
16 CreateFolderStructureMaildirError(#[source] maildirs::Error, std::path::PathBuf),
17 #[cfg(feature = "maildir")]
18 #[error("cannot create notmuch folder {1}")]
19 CreateFolderStructureNotmuchError(#[source] maildirs::Error, String),
20 #[cfg(feature = "maildir")]
21 #[error("cannot delete maildir folder {1} at {0}")]
22 DeleteMaildirFolderError(#[source] maildirs::Error, String),
23 #[cfg(feature = "maildir")]
24 #[error("cannot delete maildir INBOX at {0}")]
25 DeleteMaildirInboxForbiddenError(std::path::PathBuf),
26 #[cfg(feature = "maildir")]
27 #[error("maildir: cannot list current folder from {1}")]
28 ListCurrentFolderMaildirError(#[source] maildirs::Error, std::path::PathBuf),
29 #[cfg(feature = "maildir")]
30 #[error("cannot remove maildir entry at {1}")]
31 RemoveMaildirEntryError(#[source] maildirs::Error, std::path::PathBuf),
32 #[error("cannot parse folder kind {0}")]
33 ParseFolderKindError(String),
34 #[error("cannot get uid of imap folder {0}: uid is missing")]
35 GetUidMissingImapError(u32),
36 #[error("cannot gather folders: {0}")]
37 FolderTasksFailed(JoinError),
38
39 #[error("cannot sync: cannot list folders from left cache")]
40 ListLeftFoldersCachedError(#[source] AnyBoxedError),
41 #[error("cannot sync: cannot list folders from left backend")]
42 ListLeftFoldersError(#[source] AnyBoxedError),
43 #[error("cannot sync: cannot list folders from right cache")]
44 ListRightFoldersCachedError(#[source] AnyBoxedError),
45 #[error("cannot sync: cannot list folders from right backend")]
46 ListRightFoldersError(#[source] AnyBoxedError),
47
48 #[error("cannot parse IMAP mailbox {0}: mailbox not selectable")]
50 ParseImapFolderNotSelectableError(String),
51
52 #[cfg(feature = "maildir")]
53 #[error(transparent)]
54 MaildirsError(#[from] maildirs::Error),
55}
56
57impl AnyError for Error {
58 fn as_any(&self) -> &dyn Any {
59 self
60 }
61}
62
63impl From<Error> for AnyBoxedError {
64 fn from(err: Error) -> Self {
65 Box::new(err)
66 }
67}