use crate::error::{EnqueueError, PerformError};
use serde::{de::DeserializeOwned, Serialize};
use sqlx::{Executor, Postgres};
#[async_trait::async_trait]
pub trait Job: Serialize + DeserializeOwned {
type Environment: 'static + Send + Sync;
const JOB_TYPE: &'static str;
#[doc(hidden)]
async fn enqueue<'a, C>(self, conn: C) -> Result<(), EnqueueError>
where
C: Executor<'a, Database = Postgres>,
{
crate::db::enqueue_job(conn, self).await
}
#[doc(hidden)]
fn perform(self, _: &Self::Environment, _: &sqlx::PgPool) -> Result<(), PerformError> {
panic!("Running Sync job when it should be async!");
}
}
#[async_trait::async_trait]
pub trait JobExt: Job {
async fn enqueue_batch(
data: Vec<Self>,
conn: &mut sqlx::PgConnection,
) -> Result<(), EnqueueError> {
crate::db::enqueue_jobs_batch(conn, data).await
}
}
impl<T> JobExt for T where T: Job {}