1use thiserror::Error;
4
5#[derive(Debug, Error)]
7pub enum Error {
8 #[error("Queue connection failed: {0}")]
10 ConnectionFailed(String),
11
12 #[error("Failed to serialize job: {0}")]
14 SerializationFailed(String),
15
16 #[error("Failed to deserialize job: {0}")]
18 DeserializationFailed(String),
19
20 #[error("Failed to push job to queue '{queue}': {message}")]
22 PushFailed {
23 queue: String,
25 message: String,
27 },
28
29 #[error("Failed to pop job from queue '{queue}': {message}")]
31 PopFailed {
32 queue: String,
34 message: String,
36 },
37
38 #[error("Job '{job}' failed: {message}")]
40 JobFailed {
41 job: String,
43 message: String,
45 },
46
47 #[error("Job '{job}' exceeded maximum retries ({max_retries})")]
49 MaxRetriesExceeded {
50 job: String,
52 max_retries: u32,
54 },
55
56 #[error("Redis error: {0}")]
58 Redis(#[from] redis::RedisError),
59
60 #[error("JSON error: {0}")]
62 Json(#[from] serde_json::Error),
63
64 #[error("{0}")]
66 Custom(String),
67}
68
69impl Error {
70 pub fn job_failed(job: impl Into<String>, message: impl Into<String>) -> Self {
72 Self::JobFailed {
73 job: job.into(),
74 message: message.into(),
75 }
76 }
77
78 pub fn push_failed(queue: impl Into<String>, message: impl Into<String>) -> Self {
80 Self::PushFailed {
81 queue: queue.into(),
82 message: message.into(),
83 }
84 }
85
86 pub fn custom(message: impl Into<String>) -> Self {
88 Self::Custom(message.into())
89 }
90}
91
92impl From<String> for Error {
93 fn from(s: String) -> Self {
94 Self::Custom(s)
95 }
96}
97
98impl From<&str> for Error {
99 fn from(s: &str) -> Self {
100 Self::Custom(s.to_string())
101 }
102}