use async_trait::async_trait;
use serde::Serialize;
use crate::error::QueueError;
use crate::processor::Job;
use crate::queue_name::QueueName;
pub trait QueueBackend: Send + Sync + 'static {
fn name(&self) -> &'static str;
}
#[async_trait]
pub trait JobProducer: Send + Sync + 'static {
async fn push_json(&self, queue: &str, payload: serde_json::Value) -> Result<(), QueueError>;
}
#[async_trait]
pub trait JobProducerExt: JobProducer {
async fn push_to<Q: QueueName>(&self, job: Q::Job) -> Result<(), QueueError> {
let value = serde_json::to_value(&job)?;
self.push_json(Q::NAME, value).await
}
async fn push<J: Job + Serialize>(&self, queue: &str, job: J) -> Result<(), QueueError> {
let value = serde_json::to_value(&job)?;
self.push_json(queue, value).await
}
}
impl<T: JobProducer + ?Sized> JobProducerExt for T {}