1#[derive(Debug, thiserror::Error)]
7pub enum Error {
8 #[error("IO error: {0}")]
10 Io(#[from] std::io::Error),
11
12 #[error("Configuration error: {0}")]
14 Config(String),
15
16 #[error("Validation error: {0}")]
18 Validation(String),
19
20 #[error("Template error: {0}")]
22 Template(String),
23
24 #[error("Update error: {0}")]
26 Update(String),
27
28 #[error("Standards violation: {0}")]
30 Standards(String),
31
32 #[error("CLI error: {0}")]
34 Cli(String),
35
36 #[error("Process error: {0}")]
38 Process(String),
39
40 #[error("Serialization error: {0}")]
42 Serialization(#[from] serde_json::Error),
43
44 #[error("TOML error: {0}")]
46 Toml(#[from] toml::de::Error),
47
48 #[error("Network error: {0}")]
50 Network(String),
51
52 #[error("Version error: {0}")]
54 Version(#[from] semver::Error),
55
56 #[error("Parse error: {0}")]
58 Parse(String),
59
60 #[error("Rust not found: {0}")]
62 RustNotFound(String),
63
64 #[error("Command error: {0}")]
66 Command(String),
67
68 #[error("File not found: {0}")]
70 FileNotFound(String),
71
72 #[error("Rate limited: retry after {0} seconds")]
74 RateLimited(u64),
75
76 #[error("Migration error: {0}")]
78 Migration(String),
79
80 #[error("Regex error: {0}")]
82 Regex(#[from] regex::Error),
83
84 #[error("UTF-8 error: {0}")]
86 Utf8(#[from] std::str::Utf8Error),
87
88 #[error("Safety error: {0}")]
90 Safety(String),
91
92 #[error("Safety blocked: {0}")]
94 SafetyBlocked(String),
95}
96
97pub type Result<T> = std::result::Result<T, Error>;
99
100impl Error {
101 pub fn config(msg: impl Into<String>) -> Self {
111 Self::Config(msg.into())
112 }
113
114 pub fn validation(msg: impl Into<String>) -> Self {
124 Self::Validation(msg.into())
125 }
126
127 pub fn template(msg: impl Into<String>) -> Self {
129 Self::Template(msg.into())
130 }
131
132 pub fn update(msg: impl Into<String>) -> Self {
134 Self::Update(msg.into())
135 }
136
137 pub fn standards(msg: impl Into<String>) -> Self {
139 Self::Standards(msg.into())
140 }
141
142 pub fn cli(msg: impl Into<String>) -> Self {
144 Self::Cli(msg.into())
145 }
146
147 pub fn process(msg: impl Into<String>) -> Self {
157 Self::Process(msg.into())
158 }
159
160 pub fn parse(msg: impl Into<String>) -> Self {
162 Self::Parse(msg.into())
163 }
164
165 pub fn rust_not_found(msg: impl Into<String>) -> Self {
167 Self::RustNotFound(msg.into())
168 }
169
170 pub fn command(msg: impl Into<String>) -> Self {
172 Self::Command(msg.into())
173 }
174
175 pub fn file_not_found(msg: impl Into<String>) -> Self {
177 Self::FileNotFound(msg.into())
178 }
179
180 pub fn rate_limited(retry_after: u64) -> Self {
182 Self::RateLimited(retry_after)
183 }
184
185 pub fn io(msg: impl Into<String>) -> Self {
187 Self::Io(std::io::Error::other(msg.into()))
188 }
189
190 pub fn security(msg: impl Into<String>) -> Self {
192 Self::Validation(format!("Security: {}", msg.into()))
193 }
194
195 pub fn migration(msg: impl Into<String>) -> Self {
197 Self::Migration(msg.into())
198 }
199
200 pub fn network(msg: impl Into<String>) -> Self {
202 Self::Network(msg.into())
203 }
204
205 pub fn safety(msg: impl Into<String>) -> Self {
207 Self::Safety(msg.into())
208 }
209
210 pub fn safety_blocked(msg: impl Into<String>) -> Self {
212 Self::SafetyBlocked(msg.into())
213 }
214
215 pub fn tool_not_found(tool: impl Into<String>) -> Self {
217 Self::Process(format!("Tool not found: {}", tool.into()))
218 }
219}
220
221impl From<anyhow::Error> for Error {
223 fn from(err: anyhow::Error) -> Self {
224 Self::Process(err.to_string())
225 }
226}
227
228impl From<reqwest::Error> for Error {
230 fn from(err: reqwest::Error) -> Self {
231 Self::Network(err.to_string())
232 }
233}