1use std::time::Duration;
2
3use thiserror::Error;
4
5#[derive(Error, Debug)]
9pub enum ForgeError {
10 #[error("Configuration error: {0}")]
12 Config(String),
13
14 #[error("Database error: {0}")]
16 Database(String),
17
18 #[error("Function error: {0}")]
20 Function(String),
21
22 #[error("Job error: {0}")]
24 Job(String),
25
26 #[error("Job cancelled: {0}")]
28 JobCancelled(String),
29
30 #[error("Cluster error: {0}")]
32 Cluster(String),
33
34 #[error("Serialization error: {0}")]
36 Serialization(String),
37
38 #[error("Deserialization error: {0}")]
40 Deserialization(String),
41
42 #[error("IO error: {0}")]
44 Io(#[from] std::io::Error),
45
46 #[error("SQL error: {0}")]
48 Sql(#[from] sqlx::Error),
49
50 #[error("Invalid argument: {0}")]
52 InvalidArgument(String),
53
54 #[error("Not found: {0}")]
56 NotFound(String),
57
58 #[error("Unauthorized: {0}")]
60 Unauthorized(String),
61
62 #[error("Forbidden: {0}")]
64 Forbidden(String),
65
66 #[error("Validation error: {0}")]
68 Validation(String),
69
70 #[error("Timeout: {0}")]
72 Timeout(String),
73
74 #[error("Internal error: {0}")]
76 Internal(String),
77
78 #[error("Invalid state: {0}")]
80 InvalidState(String),
81
82 #[error("Workflow suspended")]
84 WorkflowSuspended,
85
86 #[error("Rate limit exceeded: retry after {retry_after:?}")]
88 RateLimitExceeded {
89 retry_after: Duration,
91 limit: u32,
93 remaining: u32,
95 },
96}
97
98impl From<serde_json::Error> for ForgeError {
99 fn from(e: serde_json::Error) -> Self {
100 ForgeError::Serialization(e.to_string())
101 }
102}
103
104pub type Result<T> = std::result::Result<T, ForgeError>;