use async_trait::async_trait;
use serde::{Serialize, de::DeserializeOwned};
use crate::backoff::BackoffStrategy;
use crate::context::TaskContext;
use crate::error::TaskResult;
use crate::signature::Signature;
#[async_trait]
pub trait Task: Send + Sync + Serialize + DeserializeOwned + 'static {
const NAME: &'static str;
const QUEUE: &'static str = "default";
const MAX_RETRIES: u32 = 3;
fn backoff() -> BackoffStrategy {
BackoffStrategy::default()
}
type Output: Serialize + DeserializeOwned + Send;
async fn run(&self, ctx: &TaskContext) -> TaskResult<Self::Output>;
fn signature(&self) -> Signature {
Signature::new(
Self::NAME,
Self::QUEUE,
serde_json::to_value(self).expect("task must be serializable"),
)
.with_max_retries(Self::MAX_RETRIES)
}
}