1use std::{io, result};
2
3use inquire::InquireError;
4use thiserror::Error;
5
6#[derive(Debug, Error)]
7pub enum Error {
8 #[cfg(feature = "wizard")]
9 #[error("cannot create TOML config parent directory at {1}")]
10 CreateTomlConfigParentDirectoryError(#[source] std::io::Error, std::path::PathBuf),
11 #[cfg(feature = "wizard")]
12 #[error("cannot write TOML config at {1}")]
13 WriteTomlConfigError(#[source] std::io::Error, std::path::PathBuf),
14
15 #[cfg(feature = "config")]
16 #[error("cannot create TOML config from invalid or missing paths")]
17 CreateTomlConfigFromInvalidPathsError,
18 #[cfg(feature = "config")]
19 #[error("cannot create TOML config from wizard")]
20 CreateTomlConfigFromWizardError(#[source] color_eyre::eyre::Error),
21 #[error("cannot prompt unsigned integer (u16)")]
22 PromptU16Error(#[source] InquireError),
23 #[error("cannot prompt unsigned integer (usize)")]
24 PromptUsizeError(#[source] InquireError),
25 #[error("cannot prompt secret")]
26 PromptSecretError(#[source] InquireError),
27 #[error("cannot prompt password")]
28 PromptPasswordError(#[source] InquireError),
29 #[error("cannot prompt text")]
30 PromptTextError(#[source] InquireError),
31 #[error("cannot prompt boolean")]
32 PromptBoolError(#[source] InquireError),
33 #[error("cannot prompt item from list")]
34 PromptItemError(#[source] InquireError),
35 #[cfg(feature = "email")]
36 #[error("cannot prompt email")]
37 PromptEmailError(#[source] InquireError),
38 #[cfg(feature = "path")]
39 #[error("cannot prompt path")]
40 PromptPathError(#[source] InquireError),
41
42 #[cfg(feature = "oauth2")]
43 #[error(transparent)]
44 OAuth2Error(#[from] oauth::v2_0::Error),
45 #[cfg(feature = "imap")]
46 #[error(transparent)]
47 AccountError(#[from] email::account::Error),
48 #[cfg(feature = "imap")]
49 #[error(transparent)]
50 ImapError(#[from] email::imap::Error),
51 #[cfg(feature = "smtp")]
52 #[error(transparent)]
53 SmtpError(#[from] email::smtp::Error),
54 #[cfg(feature = "imap")]
55 #[error(transparent)]
56 SecretError(#[from] secret::Error),
57
58 #[cfg(feature = "wizard")]
59 #[error(transparent)]
60 JoinError(#[from] tokio::task::JoinError),
61
62 #[cfg(feature = "config")]
63 #[error("cannot read config file from empty paths")]
64 ReadTomlConfigFileFromEmptyPaths,
65 #[cfg(feature = "config")]
66 #[error("cannot read config file at {}", .1.display())]
67 ReadTomlConfigFile(#[source] std::io::Error, std::path::PathBuf),
68 #[cfg(feature = "config")]
69 #[error("cannot parse config file at {}", .1.display())]
70 ParseTomlConfigFile(#[source] toml::de::Error, std::path::PathBuf),
71 #[cfg(feature = "config")]
72 #[error("cannot merge config files: {0}")]
73 MergeTomlConfigFiles(serde_toml_merge::Error),
74 #[cfg(feature = "config")]
75 #[error("cannot get XDG config directory")]
76 GetXdgConfigDirectory,
77 #[cfg(feature = "config")]
78 #[error("cannot serialize TOML config")]
79 SerializeTomlConfigError(#[source] toml::ser::Error),
80 #[cfg(feature = "config")]
81 #[error("cannot parse serialized TOML config as document")]
82 ParseSerializedTomlConfigError(#[source] toml_edit::TomlError),
83 #[cfg(feature = "config")]
84 #[error("cannot build final configuration for account {0}")]
85 BuildAccountConfigError(String),
86 #[cfg(feature = "config")]
87 #[error("cannot find default account configuration")]
88 GetDefaultAccountConfigError,
89 #[cfg(feature = "config")]
90 #[error("cannot find configuration for account {0}")]
91 GetAccountConfigError(String),
92 #[cfg(all(feature = "config", feature = "himalaya"))]
93 #[error("cannot create config file {}", .1.display())]
94 CreateConfigFileError(#[source] std::io::Error, std::path::PathBuf),
95 #[cfg(all(feature = "config", feature = "himalaya"))]
96 #[error("cannot write config to file {}", .1.display())]
97 WriteConfigFileError(#[source] std::io::Error, std::path::PathBuf),
98}
99
100pub type Result<T> = result::Result<T, Error>;
101
102impl From<Error> for io::Error {
103 fn from(err: Error) -> Self {
104 io::Error::new(io::ErrorKind::InvalidInput, err)
105 }
106}