1use crate::renderer::RendererError;
2use std::fmt;
3use std::io;
4
5#[derive(Debug)]
7pub enum ChromaCatError {
8 IoError(io::Error),
10 InvalidParameter {
12 name: String,
13 value: f64,
14 min: f64,
15 max: f64,
16 },
17 InvalidTheme(String),
19 GradientError(String),
21 PatternError {
23 pattern: String,
24 param: String,
25 message: String,
26 },
27 InputError(String),
29 ParseError(String),
31 RenderError(String),
33 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
94impl 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
105impl 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
123pub type Result<T> = std::result::Result<T, ChromaCatError>;