use graphile_worker_ctx::WorkerContext;
use serde::Deserialize;
use serde::Serialize;
use std::fmt::Debug;
use std::future::Future;
use super::definition::JobDefinition;
#[derive(Debug, Clone, PartialEq)]
pub enum BatchTaskResult<E> {
Complete,
FailAll(E),
ItemResults(Vec<Result<(), E>>),
}
pub trait IntoBatchTaskHandlerResult {
fn into_batch_task_handler_result(self) -> BatchTaskResult<impl Debug>;
}
impl IntoBatchTaskHandlerResult for () {
fn into_batch_task_handler_result(self) -> BatchTaskResult<impl Debug> {
BatchTaskResult::<()>::Complete
}
}
impl<D: Debug> IntoBatchTaskHandlerResult for Result<(), D> {
fn into_batch_task_handler_result(self) -> BatchTaskResult<impl Debug> {
match self {
Ok(()) => BatchTaskResult::Complete,
Err(error) => BatchTaskResult::FailAll(error),
}
}
}
impl<D: Debug> IntoBatchTaskHandlerResult for Vec<Result<(), D>> {
fn into_batch_task_handler_result(self) -> BatchTaskResult<impl Debug> {
BatchTaskResult::ItemResults(self)
}
}
impl<D: Debug> IntoBatchTaskHandlerResult for BatchTaskResult<D> {
fn into_batch_task_handler_result(self) -> BatchTaskResult<impl Debug> {
self
}
}
pub trait BatchTaskHandler: Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static {
const IDENTIFIER: &'static str;
fn definition() -> JobDefinition
where
Self: Sized,
{
JobDefinition::of_batch::<Self>()
}
fn run_batch(
items: Vec<Self>,
ctx: WorkerContext,
) -> impl Future<Output = impl IntoBatchTaskHandlerResult> + Send + 'static;
}