use thiserror::Error;
use std::path::PathBuf;
#[derive(Error, Debug)]
pub enum PocketError {
#[error("Storage error: {0}")]
Storage(String),
#[error("Entry error: {0}")]
Entry(String),
#[error("CLI error: {0}")]
Cli(String),
#[error("Card error: {0}")]
Card(String),
#[error("Hook error: {0}")]
Hook(String),
#[error("File error: {source}")]
File {
#[source]
source: std::io::Error,
path: PathBuf,
},
#[error("Configuration error: {0}")]
Config(String),
#[error("Search error: {0}")]
Search(String),
#[error("Operation canceled by user")]
Canceled,
#[error("Permission denied: {0}")]
PermissionDenied(String),
#[error("Unexpected error: {0}")]
Other(String),
}
pub type PocketResult<T> = std::result::Result<T, PocketError>;
pub trait IntoAnyhow<T> {
fn into_anyhow(self) -> anyhow::Result<T>;
}
impl<T> IntoAnyhow<T> for PocketResult<T> {
fn into_anyhow(self) -> anyhow::Result<T> {
self.map_err(|e| anyhow::anyhow!(e.to_string()))
}
}
pub trait IntoPocketError<T> {
fn storage_err(self, msg: &str) -> PocketResult<T>;
fn entry_err(self, msg: &str) -> PocketResult<T>;
fn card_err(self, msg: &str) -> PocketResult<T>;
fn hook_err(self, msg: &str) -> PocketResult<T>;
fn config_err(self, msg: &str) -> PocketResult<T>;
fn search_err(self, msg: &str) -> PocketResult<T>;
fn other_err(self, msg: &str) -> PocketResult<T>;
}
impl<T, E: std::error::Error + Send + Sync + 'static> IntoPocketError<T> for Result<T, E> {
fn storage_err(self, msg: &str) -> PocketResult<T> {
self.map_err(|e| PocketError::Storage(format!("{}: {}", msg, e)))
}
fn entry_err(self, msg: &str) -> PocketResult<T> {
self.map_err(|e| PocketError::Entry(format!("{}: {}", msg, e)))
}
fn card_err(self, msg: &str) -> PocketResult<T> {
self.map_err(|e| PocketError::Card(format!("{}: {}", msg, e)))
}
fn hook_err(self, msg: &str) -> PocketResult<T> {
self.map_err(|e| PocketError::Hook(format!("{}: {}", msg, e)))
}
fn config_err(self, msg: &str) -> PocketResult<T> {
self.map_err(|e| PocketError::Config(format!("{}: {}", msg, e)))
}
fn search_err(self, msg: &str) -> PocketResult<T> {
self.map_err(|e| PocketError::Search(format!("{}: {}", msg, e)))
}
fn other_err(self, msg: &str) -> PocketResult<T> {
self.map_err(|e| PocketError::Other(format!("{}: {}", msg, e)))
}
}