ferrous_forge/
error.rs

1//! Error handling for Ferrous Forge
2//!
3//! This module provides a unified error handling system for all Ferrous Forge operations.
4
5/// Ferrous Forge specific errors
6#[derive(Debug, thiserror::Error)]
7pub enum Error {
8    /// IO errors (file operations, etc.)
9    #[error("IO error: {0}")]
10    Io(#[from] std::io::Error),
11
12    /// Configuration errors
13    #[error("Configuration error: {0}")]
14    Config(String),
15
16    /// Validation errors
17    #[error("Validation error: {0}")]
18    Validation(String),
19
20    /// Template errors
21    #[error("Template error: {0}")]
22    Template(String),
23
24    /// Update system errors
25    #[error("Update error: {0}")]
26    Update(String),
27
28    /// Standards enforcement errors
29    #[error("Standards violation: {0}")]
30    Standards(String),
31
32    /// CLI argument errors
33    #[error("CLI error: {0}")]
34    Cli(String),
35
36    /// External process errors
37    #[error("Process error: {0}")]
38    Process(String),
39
40    /// Serialization errors
41    #[error("Serialization error: {0}")]
42    Serialization(#[from] serde_json::Error),
43
44    /// TOML parsing errors
45    #[error("TOML error: {0}")]
46    Toml(#[from] toml::de::Error),
47
48    /// Network/HTTP errors
49    #[error("Network error: {0}")]
50    Network(String),
51
52    /// Semver parsing errors
53    #[error("Version error: {0}")]
54    Version(#[from] semver::Error),
55
56    /// Parse errors
57    #[error("Parse error: {0}")]
58    Parse(String),
59
60    /// Rust not found
61    #[error("Rust not found: {0}")]
62    RustNotFound(String),
63
64    /// Command execution error
65    #[error("Command error: {0}")]
66    Command(String),
67
68    /// File not found
69    #[error("File not found: {0}")]
70    FileNotFound(String),
71
72    /// Rate limited
73    #[error("Rate limited: retry after {0} seconds")]
74    RateLimited(u64),
75
76    /// Migration error
77    #[error("Migration error: {0}")]
78    Migration(String),
79
80    /// Regex error
81    #[error("Regex error: {0}")]
82    Regex(#[from] regex::Error),
83
84    /// UTF-8 conversion error
85    #[error("UTF-8 error: {0}")]
86    Utf8(#[from] std::str::Utf8Error),
87}
88
89/// Result type alias for Ferrous Forge operations
90pub type Result<T> = std::result::Result<T, Error>;
91
92impl Error {
93    /// Create a new configuration error
94    pub fn config(msg: impl Into<String>) -> Self {
95        Self::Config(msg.into())
96    }
97
98    /// Create a new validation error
99    pub fn validation(msg: impl Into<String>) -> Self {
100        Self::Validation(msg.into())
101    }
102
103    /// Create a new template error
104    pub fn template(msg: impl Into<String>) -> Self {
105        Self::Template(msg.into())
106    }
107
108    /// Create a new update error
109    pub fn update(msg: impl Into<String>) -> Self {
110        Self::Update(msg.into())
111    }
112
113    /// Create a new standards error
114    pub fn standards(msg: impl Into<String>) -> Self {
115        Self::Standards(msg.into())
116    }
117
118    /// Create a new CLI error
119    pub fn cli(msg: impl Into<String>) -> Self {
120        Self::Cli(msg.into())
121    }
122
123    /// Create a new process error
124    pub fn process(msg: impl Into<String>) -> Self {
125        Self::Process(msg.into())
126    }
127
128    /// Create a new parse error
129    pub fn parse(msg: impl Into<String>) -> Self {
130        Self::Parse(msg.into())
131    }
132
133    /// Create a new rust not found error
134    pub fn rust_not_found(msg: impl Into<String>) -> Self {
135        Self::RustNotFound(msg.into())
136    }
137
138    /// Create a new command error
139    pub fn command(msg: impl Into<String>) -> Self {
140        Self::Command(msg.into())
141    }
142
143    /// Create a new file not found error
144    pub fn file_not_found(msg: impl Into<String>) -> Self {
145        Self::FileNotFound(msg.into())
146    }
147
148    /// Create a new rate limited error
149    pub fn rate_limited(retry_after: u64) -> Self {
150        Self::RateLimited(retry_after)
151    }
152
153    /// Create a new migration error
154    pub fn migration(msg: impl Into<String>) -> Self {
155        Self::Migration(msg.into())
156    }
157
158    /// Create a new network error
159    pub fn network(msg: impl Into<String>) -> Self {
160        Self::Network(msg.into())
161    }
162}
163
164/// Convert anyhow errors to our error type
165impl From<anyhow::Error> for Error {
166    fn from(err: anyhow::Error) -> Self {
167        Self::Process(err.to_string())
168    }
169}
170
171/// Convert reqwest errors to our error type
172impl From<reqwest::Error> for Error {
173    fn from(err: reqwest::Error) -> Self {
174        Self::Network(err.to_string())
175    }
176}