pg-queue 0.1.0

PostgreSQL job queue, pub/sub, and cache using SKIP LOCKED and LISTEN/NOTIFY
Documentation
use thiserror::Error;

#[derive(Debug, Error)]
pub enum PgQueueError {
    #[error("Database error: {0}")]
    Database(#[from] sqlx::Error),

    #[error("Serialization error: {0}")]
    Serialization(#[from] serde_json::Error),

    #[error("Queue not found: {0}")]
    QueueNotFound(String),

    #[error("Listener error: {0}")]
    Listener(String),

    #[error("Timeout waiting for response")]
    Timeout,

    #[error("Invalid queue name: {0} (must be alphanumeric/underscore, non-empty)")]
    InvalidQueueName(String),
}

pub type Result<T> = std::result::Result<T, PgQueueError>;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_error_display() {
        let err = PgQueueError::QueueNotFound("orders".to_string());
        assert_eq!(err.to_string(), "Queue not found: orders");

        let err = PgQueueError::Timeout;
        assert_eq!(err.to_string(), "Timeout waiting for response");

        let err = PgQueueError::InvalidQueueName("bad;name".to_string());
        assert!(err.to_string().contains("bad;name"));
    }

    #[test]
    fn test_error_from_serde() {
        let json_err = serde_json::from_str::<String>("invalid").unwrap_err();
        let err: PgQueueError = json_err.into();
        assert!(matches!(err, PgQueueError::Serialization(_)));
    }
}