1use thiserror::Error;
2
3#[derive(Debug, Error)]
4pub enum PgQueueError {
5 #[error("Database error: {0}")]
6 Database(#[from] sqlx::Error),
7
8 #[error("Serialization error: {0}")]
9 Serialization(#[from] serde_json::Error),
10
11 #[error("Queue not found: {0}")]
12 QueueNotFound(String),
13
14 #[error("Listener error: {0}")]
15 Listener(String),
16
17 #[error("Timeout waiting for response")]
18 Timeout,
19
20 #[error("Invalid queue name: {0} (must be alphanumeric/underscore, non-empty)")]
21 InvalidQueueName(String),
22}
23
24pub type Result<T> = std::result::Result<T, PgQueueError>;
25
26#[cfg(test)]
27mod tests {
28 use super::*;
29
30 #[test]
31 fn test_error_display() {
32 let err = PgQueueError::QueueNotFound("orders".to_string());
33 assert_eq!(err.to_string(), "Queue not found: orders");
34
35 let err = PgQueueError::Timeout;
36 assert_eq!(err.to_string(), "Timeout waiting for response");
37
38 let err = PgQueueError::InvalidQueueName("bad;name".to_string());
39 assert!(err.to_string().contains("bad;name"));
40 }
41
42 #[test]
43 fn test_error_from_serde() {
44 let json_err = serde_json::from_str::<String>("invalid").unwrap_err();
45 let err: PgQueueError = json_err.into();
46 assert!(matches!(err, PgQueueError::Serialization(_)));
47 }
48}