1use std::{io, path::PathBuf};
4
5pub type CliResult<T> = Result<T, CliError>;
7
8#[derive(Debug, thiserror::Error)]
10pub enum CliError {
11 #[error("{0}")]
13 Usage(String),
14 #[error("configuration error: {0}")]
16 Config(String),
17 #[error("storage error: {0}")]
19 Storage(String),
20 #[error("not found: {0}")]
22 NotFound(String),
23 #[error("filesystem error at {}: {source}", path.display())]
25 Io {
26 path: PathBuf,
28 #[source]
30 source: io::Error,
31 },
32 #[error("run failed: {0}")]
34 Run(String),
35 #[error("serialization error: {0}")]
37 Serialization(String),
38}
39
40impl From<rusqlite::Error> for CliError {
41 fn from(error: rusqlite::Error) -> Self {
42 Self::Storage(error.to_string())
43 }
44}
45
46impl From<serde_json::Error> for CliError {
47 fn from(error: serde_json::Error) -> Self {
48 Self::Serialization(error.to_string())
49 }
50}
51
52impl From<toml::de::Error> for CliError {
53 fn from(error: toml::de::Error) -> Self {
54 Self::Config(error.to_string())
55 }
56}
57
58impl From<toml::ser::Error> for CliError {
59 fn from(error: toml::ser::Error) -> Self {
60 Self::Config(error.to_string())
61 }
62}
63
64pub fn io_error(path: impl Into<PathBuf>, source: io::Error) -> CliError {
66 CliError::Io {
67 path: path.into(),
68 source,
69 }
70}