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
89pub type Result<T> = std::result::Result<T, Error>;
91
92impl Error {
93 pub fn config(msg: impl Into<String>) -> Self {
95 Self::Config(msg.into())
96 }
97
98 pub fn validation(msg: impl Into<String>) -> Self {
100 Self::Validation(msg.into())
101 }
102
103 pub fn template(msg: impl Into<String>) -> Self {
105 Self::Template(msg.into())
106 }
107
108 pub fn update(msg: impl Into<String>) -> Self {
110 Self::Update(msg.into())
111 }
112
113 pub fn standards(msg: impl Into<String>) -> Self {
115 Self::Standards(msg.into())
116 }
117
118 pub fn cli(msg: impl Into<String>) -> Self {
120 Self::Cli(msg.into())
121 }
122
123 pub fn process(msg: impl Into<String>) -> Self {
125 Self::Process(msg.into())
126 }
127
128 pub fn parse(msg: impl Into<String>) -> Self {
130 Self::Parse(msg.into())
131 }
132
133 pub fn rust_not_found(msg: impl Into<String>) -> Self {
135 Self::RustNotFound(msg.into())
136 }
137
138 pub fn command(msg: impl Into<String>) -> Self {
140 Self::Command(msg.into())
141 }
142
143 pub fn file_not_found(msg: impl Into<String>) -> Self {
145 Self::FileNotFound(msg.into())
146 }
147
148 pub fn rate_limited(retry_after: u64) -> Self {
150 Self::RateLimited(retry_after)
151 }
152
153 pub fn migration(msg: impl Into<String>) -> Self {
155 Self::Migration(msg.into())
156 }
157
158 pub fn network(msg: impl Into<String>) -> Self {
160 Self::Network(msg.into())
161 }
162}
163
164impl From<anyhow::Error> for Error {
166 fn from(err: anyhow::Error) -> Self {
167 Self::Process(err.to_string())
168 }
169}
170
171impl From<reqwest::Error> for Error {
173 fn from(err: reqwest::Error) -> Self {
174 Self::Network(err.to_string())
175 }
176}