use crate::renderer::RendererError;
use std::fmt;
use std::io;
#[derive(Debug)]
pub enum ChromaCatError {
IoError(io::Error),
InvalidParameter {
name: String,
value: f64,
min: f64,
max: f64,
},
InvalidTheme(String),
GradientError(String),
PatternError {
pattern: String,
param: String,
message: String,
},
InputError(String),
ParseError(String),
RenderError(String),
Other(String),
}
impl std::error::Error for ChromaCatError {}
impl fmt::Display for ChromaCatError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::IoError(err) => write!(f, "I/O error: {}", err),
Self::InvalidParameter {
name,
value,
min,
max,
} => {
write!(
f,
"Invalid {} value {}: must be between {} and {}",
name, value, min, max
)
}
Self::InvalidTheme(msg) => write!(f, "Invalid theme: {}", msg),
Self::GradientError(msg) => write!(f, "Gradient error: {}", msg),
Self::PatternError {
pattern,
param,
message,
} => {
write!(
f,
"Pattern '{}' parameter '{}' error: {}",
pattern, param, message
)
}
Self::InputError(msg) => write!(f, "Input error: {}", msg),
Self::ParseError(msg) => write!(f, "Parse error: {}", msg),
Self::RenderError(msg) => write!(f, "Render error: {}", msg),
Self::Other(msg) => write!(f, "{}", msg),
}
}
}
impl From<io::Error> for ChromaCatError {
fn from(err: io::Error) -> Self {
Self::IoError(err)
}
}
impl From<std::fmt::Error> for ChromaCatError {
fn from(err: std::fmt::Error) -> Self {
Self::Other(err.to_string())
}
}
impl From<String> for ChromaCatError {
fn from(msg: String) -> Self {
Self::ParseError(msg)
}
}
impl From<(String, String, String)> for ChromaCatError {
fn from((pattern, param, message): (String, String, String)) -> Self {
Self::PatternError {
pattern,
param,
message,
}
}
}
impl From<RendererError> for ChromaCatError {
fn from(err: RendererError) -> Self {
match err {
RendererError::IoError(e) => Self::IoError(e),
RendererError::TerminalError(msg) => Self::RenderError(msg),
RendererError::BufferError(msg) => Self::RenderError(msg),
RendererError::InvalidConfig(msg) => Self::RenderError(msg),
RendererError::PatternError(msg) => Self::PatternError {
pattern: "render".to_string(),
param: "pattern".to_string(),
message: msg,
},
RendererError::Other(msg) => Self::RenderError(msg),
}
}
}
pub type Result<T> = std::result::Result<T, ChromaCatError>;