pocket_cli/
errors.rs

1use thiserror::Error;
2use std::path::PathBuf;
3
4/// Primary error type for the Pocket CLI application
5#[derive(Error, Debug)]
6pub enum PocketError {
7    /// Error related to storage operations
8    #[error("Storage error: {0}")]
9    Storage(String),
10
11    /// Error related to specific entry operations
12    #[error("Entry error: {0}")]
13    Entry(String),
14
15    /// Error related to CLI operations
16    #[error("CLI error: {0}")]
17    Cli(String),
18
19    /// Error related to card operations
20    #[error("Card error: {0}")]
21    Card(String),
22
23    /// Error related to hook/blend operations
24    #[error("Hook error: {0}")]
25    Hook(String),
26
27    /// Error related to file operations
28    #[error("File error: {source}")]
29    File {
30        #[source]
31        source: std::io::Error,
32        path: PathBuf,
33    },
34
35    /// Error related to configuration
36    #[error("Configuration error: {0}")]
37    Config(String),
38
39    /// Error related to search operations
40    #[error("Search error: {0}")]
41    Search(String),
42
43    /// User canceled an operation
44    #[error("Operation canceled by user")]
45    Canceled,
46
47    /// Missing permission
48    #[error("Permission denied: {0}")]
49    PermissionDenied(String),
50
51    /// Other unexpected errors
52    #[error("Unexpected error: {0}")]
53    Other(String),
54}
55
56/// Result type alias for Pocket CLI
57pub type PocketResult<T> = std::result::Result<T, PocketError>;
58
59/// Helper functions for converting errors
60pub 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
70/// Helper trait for converting errors to PocketError
71pub 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}