chromacat/
error.rs

1use crate::renderer::RendererError;
2use std::fmt;
3use std::io;
4
5/// Custom error types for ChromaCat
6#[derive(Debug)]
7pub enum ChromaCatError {
8    /// I/O operation failed
9    IoError(io::Error),
10    /// Invalid parameter value
11    InvalidParameter {
12        name: String,
13        value: f64,
14        min: f64,
15        max: f64,
16    },
17    /// Invalid theme name or configuration
18    InvalidTheme(String),
19    /// Invalid gradient configuration
20    GradientError(String),
21    /// Pattern parameter validation error
22    PatternError {
23        pattern: String,
24        param: String,
25        message: String,
26    },
27    /// Input file error
28    InputError(String),
29    /// Parameter parsing error
30    ParseError(String),
31    /// Rendering error
32    RenderError(String),
33    /// General error with message
34    Other(String),
35}
36
37impl std::error::Error for ChromaCatError {}
38
39impl fmt::Display for ChromaCatError {
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41        match self {
42            Self::IoError(err) => write!(f, "I/O error: {}", err),
43            Self::InvalidParameter {
44                name,
45                value,
46                min,
47                max,
48            } => {
49                write!(
50                    f,
51                    "Invalid {} value {}: must be between {} and {}",
52                    name, value, min, max
53                )
54            }
55            Self::InvalidTheme(msg) => write!(f, "Invalid theme: {}", msg),
56            Self::GradientError(msg) => write!(f, "Gradient error: {}", msg),
57            Self::PatternError {
58                pattern,
59                param,
60                message,
61            } => {
62                write!(
63                    f,
64                    "Pattern '{}' parameter '{}' error: {}",
65                    pattern, param, message
66                )
67            }
68            Self::InputError(msg) => write!(f, "Input error: {}", msg),
69            Self::ParseError(msg) => write!(f, "Parse error: {}", msg),
70            Self::RenderError(msg) => write!(f, "Render error: {}", msg),
71            Self::Other(msg) => write!(f, "{}", msg),
72        }
73    }
74}
75
76impl From<io::Error> for ChromaCatError {
77    fn from(err: io::Error) -> Self {
78        Self::IoError(err)
79    }
80}
81
82impl From<std::fmt::Error> for ChromaCatError {
83    fn from(err: std::fmt::Error) -> Self {
84        Self::Other(err.to_string())
85    }
86}
87
88impl From<String> for ChromaCatError {
89    fn from(msg: String) -> Self {
90        Self::ParseError(msg)
91    }
92}
93
94// Add conversion from parameter validation errors
95impl From<(String, String, String)> for ChromaCatError {
96    fn from((pattern, param, message): (String, String, String)) -> Self {
97        Self::PatternError {
98            pattern,
99            param,
100            message,
101        }
102    }
103}
104
105// Add conversion from RendererError
106impl From<RendererError> for ChromaCatError {
107    fn from(err: RendererError) -> Self {
108        match err {
109            RendererError::IoError(e) => Self::IoError(e),
110            RendererError::TerminalError(msg) => Self::RenderError(msg),
111            RendererError::BufferError(msg) => Self::RenderError(msg),
112            RendererError::InvalidConfig(msg) => Self::RenderError(msg),
113            RendererError::PatternError(msg) => Self::PatternError {
114                pattern: "render".to_string(),
115                param: "pattern".to_string(),
116                message: msg,
117            },
118            RendererError::Other(msg) => Self::RenderError(msg),
119        }
120    }
121}
122
123/// Result type alias using ChromaCatError
124pub type Result<T> = std::result::Result<T, ChromaCatError>;