#[cfg(doc)]
use super::Worker;
use crate::Job;
use std::future::Future;
#[async_trait::async_trait]
pub trait JobRunner: Send + Sync {
type Error;
async fn run(&self, job: Job) -> Result<(), Self::Error>;
}
#[async_trait::async_trait]
impl<E, F, Fut> JobRunner for Box<F>
where
F: Send + Sync + Fn(Job) -> Fut,
Fut: Future<Output = Result<(), E>> + Send,
{
type Error = E;
async fn run(&self, job: Job) -> Result<(), E> {
self(job).await
}
}
#[async_trait::async_trait]
impl<'a, E, F, Fut> JobRunner for &'a F
where
F: Send + Sync + Fn(Job) -> Fut,
Fut: Future<Output = Result<(), E>> + Send,
{
type Error = E;
async fn run(&self, job: Job) -> Result<(), E> {
self(job).await
}
}
#[async_trait::async_trait]
impl<'a, E, F, Fut> JobRunner for &'a mut F
where
F: Send + Sync + Fn(Job) -> Fut,
Fut: Future<Output = Result<(), E>> + Send,
{
type Error = E;
async fn run(&self, job: Job) -> Result<(), E> {
(self as &F)(job).await
}
}
#[repr(transparent)]
pub(crate) struct Closure<F>(pub F);
#[async_trait::async_trait]
impl<E, F, Fut> JobRunner for Closure<F>
where
F: Send + Sync + Fn(Job) -> Fut,
Fut: Future<Output = Result<(), E>> + Send,
{
type Error = E;
async fn run(&self, job: Job) -> Result<(), E> {
(self.0)(job).await
}
}
pub(crate) type BoxedJobRunner<E> = Box<dyn JobRunner<Error = E>>;