use crate::error::SmithyResult;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::time::SystemTime;
pub type TaskId = String;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum TaskStatus {
Pending,
Running,
Completed,
Failed,
Dead,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueuedTask {
pub id: TaskId,
pub task_type: String,
pub payload: serde_json::Value,
pub status: TaskStatus,
pub retry_count: u32,
pub max_retries: u32,
pub created_at: SystemTime,
pub updated_at: SystemTime,
pub execute_at: Option<SystemTime>,
}
#[async_trait]
pub trait SmithyTask: Send + Sync + Serialize + for<'de> Deserialize<'de> {
type Output: Serialize + Send + Sync;
async fn forge(self) -> SmithyResult<Self::Output>;
fn task_type(&self) -> &'static str {
std::any::type_name::<Self>()
}
fn max_retries(&self) -> u32 {
3
}
fn delay(&self) -> Option<std::time::Duration> {
None
}
}