Skip to main content

pg_queue/
errors.rs

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}