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("{0}")]
16 Display(String),
17 #[error("configuration error: {0}")]
19 Config(String),
20 #[error("storage error: {0}")]
22 Storage(String),
23 #[error("not found: {0}")]
25 NotFound(String),
26 #[error("unsupported capability: {0}")]
28 Unsupported(String),
29 #[error("filesystem error at {}: {source}", path.display())]
31 Io {
32 path: PathBuf,
34 #[source]
36 source: io::Error,
37 },
38 #[error("run failed: {0}")]
40 Run(String),
41 #[error("serialization error: {0}")]
43 Serialization(String),
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}