use crate::error::ChromaCatError;
use std::fmt;
use std::io;
#[derive(Debug)]
pub enum RendererError {
IoError(io::Error),
TerminalError(String),
BufferError(String),
InvalidConfig(String),
PatternError(String),
Other(String),
}
impl fmt::Display for RendererError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::IoError(err) => write!(f, "I/O error: {}", err),
Self::TerminalError(msg) => write!(f, "Terminal error: {}", msg),
Self::BufferError(msg) => write!(f, "Buffer error: {}", msg),
Self::InvalidConfig(msg) => write!(f, "Invalid configuration: {}", msg),
Self::PatternError(msg) => write!(f, "Pattern error: {}", msg),
Self::Other(msg) => write!(f, "{}", msg),
}
}
}
impl std::error::Error for RendererError {}
impl From<io::Error> for RendererError {
fn from(err: io::Error) -> Self {
Self::IoError(err)
}
}
impl From<std::fmt::Error> for RendererError {
fn from(err: std::fmt::Error) -> Self {
Self::Other(format!("Format error: {}", err))
}
}
impl From<String> for RendererError {
fn from(msg: String) -> Self {
Self::Other(msg)
}
}
impl From<&str> for RendererError {
fn from(msg: &str) -> Self {
Self::Other(msg.to_string())
}
}
impl From<ChromaCatError> for RendererError {
fn from(err: ChromaCatError) -> Self {
match err {
ChromaCatError::IoError(e) => Self::IoError(e),
ChromaCatError::InvalidParameter { name, value, .. } => {
Self::InvalidConfig(format!("Invalid parameter {}: {}", name, value))
}
ChromaCatError::PatternError { message, .. } => Self::PatternError(message),
_ => Self::Other(err.to_string()),
}
}
}