runner_q 0.6.4

Durable activity queue and worker system
Documentation
use crate::storage::StorageError;
use thiserror::Error;

#[derive(Error, Debug)]
pub enum WorkerError {
    #[error("{0}")]
    CustomError(String),

    #[error("Activity queue error: {0}")]
    QueueError(String),

    #[error("Activity serialization error: {0}")]
    SerializationError(#[from] serde_json::Error),

    #[error("Activity execution timeout")]
    Timeout,

    #[error("Activity execution failed: {0}")]
    ExecutionError(String),

    #[error("Activity handler not found for activity type: {0}")]
    HandlerNotFound(String),

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

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

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

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

    #[error("Worker shutdown requested")]
    Shutdown,

    #[error("Worker is already running")]
    AlreadyRunning,

    #[error("Activity scheduling error: {0}")]
    SchedulingError(String),

    #[error("Duplicate activity detected: {0}")]
    DuplicateActivity(String),

    #[error("Idempotency key conflict: {0}")]
    IdempotencyConflict(String),

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

impl From<StorageError> for WorkerError {
    fn from(err: StorageError) -> Self {
        match err {
            StorageError::Unavailable(msg) => WorkerError::BackendError(msg),
            StorageError::Conflict(msg) => WorkerError::QueueError(msg),
            StorageError::NotFound(msg) => WorkerError::QueueError(msg),
            StorageError::Internal(msg) => WorkerError::QueueError(msg),
            StorageError::Serialization(msg) => WorkerError::QueueError(msg),
            StorageError::Configuration(msg) => WorkerError::ConfigError(msg),
            StorageError::Timeout(msg) => WorkerError::ExecutionError(msg),
            StorageError::DuplicateActivity(msg) => WorkerError::DuplicateActivity(msg),
            StorageError::IdempotencyConflict(msg) => WorkerError::IdempotencyConflict(msg),
        }
    }
}

impl WorkerError {
    pub fn is_retryable(&self) -> bool {
        match self {
            WorkerError::QueueError(_) => true,
            WorkerError::BackendError(_) => true,
            WorkerError::DatabaseError(_) => true,
            WorkerError::Timeout => true,
            WorkerError::ExecutionError(_) => true,
            WorkerError::SchedulingError(_) => true,
            _ => false,
        }
    }
}