use thiserror::Error;
#[derive(Debug, Error)]
pub enum RussError {
#[error("File system error: {0}")]
Io(#[from] std::io::Error),
#[error("Configuration error: {message}")]
Config {
message: String,
#[source]
source: Option<Box<dyn std::error::Error + Send + Sync>>,
},
#[error("Build error: {message}")]
Build {
message: String,
#[source]
source: Option<Box<dyn std::error::Error + Send + Sync>>,
},
#[error("Development server error: {message}")]
Dev {
message: String,
#[source]
source: Option<Box<dyn std::error::Error + Send + Sync>>,
},
#[error("Generation error: {message}")]
Generate {
message: String,
#[source]
source: Option<Box<dyn std::error::Error + Send + Sync>>,
},
#[error("Project creation error: {message}")]
NewProject {
message: String,
#[source]
source: Option<Box<dyn std::error::Error + Send + Sync>>,
},
#[error("Template error: {message}")]
Template {
message: String,
#[source]
source: Option<Box<dyn std::error::Error + Send + Sync>>,
},
#[error("Validation error: {message}")]
Validation { message: String },
#[error("{0}")]
Other(String),
}
impl RussError {
pub fn config<S: Into<String>>(message: S) -> Self {
RussError::Config {
message: message.into(),
source: None,
}
}
pub fn config_with_source<S, E>(message: S, source: E) -> Self
where
S: Into<String>,
E: std::error::Error + Send + Sync + 'static,
{
RussError::Config {
message: message.into(),
source: Some(Box::new(source)),
}
}
pub fn build<S: Into<String>>(message: S) -> Self {
RussError::Build {
message: message.into(),
source: None,
}
}
pub fn build_with_source<S, E>(message: S, source: E) -> Self
where
S: Into<String>,
E: std::error::Error + Send + Sync + 'static,
{
RussError::Build {
message: message.into(),
source: Some(Box::new(source)),
}
}
pub fn dev<S: Into<String>>(message: S) -> Self {
RussError::Dev {
message: message.into(),
source: None,
}
}
pub fn generate<S: Into<String>>(message: S) -> Self {
RussError::Generate {
message: message.into(),
source: None,
}
}
pub fn new_project<S: Into<String>>(message: S) -> Self {
RussError::NewProject {
message: message.into(),
source: None,
}
}
pub fn new_project_with_source<S, E>(message: S, source: E) -> Self
where
S: Into<String>,
E: std::error::Error + Send + Sync + 'static,
{
RussError::NewProject {
message: message.into(),
source: Some(Box::new(source)),
}
}
pub fn validation<S: Into<String>>(message: S) -> Self {
RussError::Validation {
message: message.into(),
}
}
}
pub type Result<T> = std::result::Result<T, RussError>;