snerd-rust 0.1.0

A lightweight, robust, asynchronous background job queue and persistence engine built for high-performance applications.
Documentation
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct JobErrorReturn {
    #[serde(rename = "error")]
    pub error_string: String,
    pub retry_worthy: bool,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct RetryableTask {
    #[serde(rename = "taskId")]
    pub task_id: String,

    #[serde(rename = "retryCount")]
    pub retry_count: i32,

    #[serde(rename = "maxRetries")]
    pub max_retries: i32,

    #[serde(rename = "retryAfterHours")]
    pub retry_after_hours: f64,

    #[serde(rename = "retryAfterTime")]
    pub retry_after_time: DateTime<Utc>,

    #[serde(rename = "taskData")]
    pub task_data: String,

    #[serde(rename = "taskType")]
    pub task_type: String,

    #[serde(rename = "LastErrorObj", skip_serializing_if = "Option::is_none")]
    pub last_error_obj: Option<String>,

    #[serde(rename = "LastJobError", skip_serializing_if = "Option::is_none")]
    pub last_job_error: Option<JobErrorReturn>,

    #[serde(rename = "deletedAt", skip_serializing_if = "Option::is_none")]
    pub deleted_at: Option<DateTime<Utc>>,

    #[serde(skip, default = "Utc::now")]
    pub created_at: DateTime<Utc>,

    #[serde(skip, default = "Utc::now")]
    pub updated_at: DateTime<Utc>,
}

impl RetryableTask {
    pub fn new(
        task_id: String,
        task_type: String,
        task_data: String,
        max_retries: i32,
        retry_after_hours: f64,
    ) -> Self {
        let now = Utc::now();
        Self {
            task_id,
            task_type,
            task_data,
            max_retries,
            retry_after_hours,
            retry_count: 0,
            retry_after_time: now,
            last_error_obj: None,
            last_job_error: None,
            deleted_at: None,
            created_at: now,
            updated_at: now,
        }
    }

    pub fn mark_deleted(&mut self) {
        self.deleted_at = Some(Utc::now());
        self.updated_at = Utc::now();
    }

    pub fn update_retry_config(&mut self, error_msg: Option<String>) {
        self.retry_count += 1;
        
        // Calculate next retry time
        let seconds = (self.retry_after_hours * 3600.0) as i64;
        self.retry_after_time = Utc::now() + chrono::Duration::seconds(seconds);
        
        self.last_error_obj = error_msg.clone();
        
        if let Some(msg) = error_msg {
            self.last_job_error = Some(JobErrorReturn {
                error_string: msg,
                retry_worthy: true,
            });
        } else {
            self.last_job_error = None;
        }
        
        self.updated_at = Utc::now();
    }
}