1use thiserror::Error;
2use std::path::PathBuf;
3
4#[derive(Error, Debug)]
6pub enum PocketError {
7 #[error("Storage error: {0}")]
9 Storage(String),
10
11 #[error("Entry error: {0}")]
13 Entry(String),
14
15 #[error("CLI error: {0}")]
17 Cli(String),
18
19 #[error("Card error: {0}")]
21 Card(String),
22
23 #[error("Hook error: {0}")]
25 Hook(String),
26
27 #[error("File error: {source}")]
29 File {
30 #[source]
31 source: std::io::Error,
32 path: PathBuf,
33 },
34
35 #[error("Configuration error: {0}")]
37 Config(String),
38
39 #[error("Search error: {0}")]
41 Search(String),
42
43 #[error("Operation canceled by user")]
45 Canceled,
46
47 #[error("Permission denied: {0}")]
49 PermissionDenied(String),
50
51 #[error("Unexpected error: {0}")]
53 Other(String),
54}
55
56pub type PocketResult<T> = std::result::Result<T, PocketError>;
58
59pub trait IntoAnyhow<T> {
61 fn into_anyhow(self) -> anyhow::Result<T>;
62}
63
64impl<T> IntoAnyhow<T> for PocketResult<T> {
65 fn into_anyhow(self) -> anyhow::Result<T> {
66 self.map_err(|e| anyhow::anyhow!(e.to_string()))
67 }
68}
69
70pub trait IntoPocketError<T> {
72 fn storage_err(self, msg: &str) -> PocketResult<T>;
73 fn entry_err(self, msg: &str) -> PocketResult<T>;
74 fn card_err(self, msg: &str) -> PocketResult<T>;
75 fn hook_err(self, msg: &str) -> PocketResult<T>;
76 fn config_err(self, msg: &str) -> PocketResult<T>;
77 fn search_err(self, msg: &str) -> PocketResult<T>;
78 fn other_err(self, msg: &str) -> PocketResult<T>;
79}
80
81impl<T, E: std::error::Error + Send + Sync + 'static> IntoPocketError<T> for Result<T, E> {
82 fn storage_err(self, msg: &str) -> PocketResult<T> {
83 self.map_err(|e| PocketError::Storage(format!("{}: {}", msg, e)))
84 }
85
86 fn entry_err(self, msg: &str) -> PocketResult<T> {
87 self.map_err(|e| PocketError::Entry(format!("{}: {}", msg, e)))
88 }
89
90 fn card_err(self, msg: &str) -> PocketResult<T> {
91 self.map_err(|e| PocketError::Card(format!("{}: {}", msg, e)))
92 }
93
94 fn hook_err(self, msg: &str) -> PocketResult<T> {
95 self.map_err(|e| PocketError::Hook(format!("{}: {}", msg, e)))
96 }
97
98 fn config_err(self, msg: &str) -> PocketResult<T> {
99 self.map_err(|e| PocketError::Config(format!("{}: {}", msg, e)))
100 }
101
102 fn search_err(self, msg: &str) -> PocketResult<T> {
103 self.map_err(|e| PocketError::Search(format!("{}: {}", msg, e)))
104 }
105
106 fn other_err(self, msg: &str) -> PocketResult<T> {
107 self.map_err(|e| PocketError::Other(format!("{}: {}", msg, e)))
108 }
109}