use std::{io, path::PathBuf};
pub type CliResult<T> = Result<T, CliError>;
#[derive(Debug, thiserror::Error)]
pub enum CliError {
#[error("{0}")]
Usage(String),
#[error("{0}")]
Display(String),
#[error("configuration error: {0}")]
Config(String),
#[error("storage error: {0}")]
Storage(String),
#[error("not found: {0}")]
NotFound(String),
#[error("unsupported capability: {0}")]
Unsupported(String),
#[error("filesystem error at {}: {source}", path.display())]
Io {
path: PathBuf,
#[source]
source: io::Error,
},
#[error("run failed: {0}")]
Run(String),
#[error("serialization error: {0}")]
Serialization(String),
}
impl From<serde_json::Error> for CliError {
fn from(error: serde_json::Error) -> Self {
Self::Serialization(error.to_string())
}
}
impl From<toml::de::Error> for CliError {
fn from(error: toml::de::Error) -> Self {
Self::Config(error.to_string())
}
}
impl From<toml::ser::Error> for CliError {
fn from(error: toml::ser::Error) -> Self {
Self::Config(error.to_string())
}
}
pub fn io_error(path: impl Into<PathBuf>, source: io::Error) -> CliError {
CliError::Io {
path: path.into(),
source,
}
}