use crate::job::{BoxedExecFn, RecurringJobId, RecurringJobRequest}; use core::fmt;
use std::sync::Arc;
use thiserror::Error;
use tokio::sync::{mpsc, oneshot};
#[derive(Error, Debug, Clone, PartialEq, Eq)]
pub enum BuildError {
#[error("Maximum worker count (`max_workers`) must be specified and greater than zero")]
MissingOrZeroMaxWorkers,
}
#[derive(Error)]
pub enum SubmitError<T = (RecurringJobRequest, Arc<BoxedExecFn>)> {
#[error("Staging buffer is full, job rejected. Caller may retry.")]
StagingFull(T),
#[error("Scheduler's staging channel is closed (likely shut down or panicked).")]
ChannelClosed(T),
}
impl fmt::Debug for SubmitError<(RecurringJobRequest, Arc<BoxedExecFn>)> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SubmitError::StagingFull((request, _)) => f
.debug_struct("SubmitError::StagingFull")
.field("request", request) .field("exec_fn", &format_args!("<Fn>")) .finish(),
SubmitError::ChannelClosed((request, _)) => f
.debug_struct("SubmitError::ChannelClosed")
.field("request", request)
.field("exec_fn", &format_args!("<Fn>"))
.finish(),
}
}
}
impl<T> From<mpsc::error::TrySendError<T>> for SubmitError<T> {
fn from(err: mpsc::error::TrySendError<T>) -> Self {
match err {
mpsc::error::TrySendError::Full(job_data) => SubmitError::StagingFull(job_data),
mpsc::error::TrySendError::Closed(job_data) => SubmitError::ChannelClosed(job_data),
}
}
}
impl<T> From<mpsc::error::SendError<T>> for SubmitError<T> {
fn from(err: mpsc::error::SendError<T>) -> Self {
SubmitError::ChannelClosed(err.0)
}
}
#[derive(Error, Debug, Clone, PartialEq, Eq)]
pub enum QueryError {
#[error("Scheduler command channel is closed (likely shut down or panicked).")]
SchedulerShutdown,
#[error("Scheduler did not respond to the query (Coordinator task may have panicked or shutdown unexpectedly).")]
ResponseFailed,
#[error("Job with lineage ID {0} not found.")]
JobNotFound(RecurringJobId),
}
#[derive(Error, Debug, Clone, PartialEq, Eq)]
pub enum ShutdownError {
#[error("Failed to send shutdown signal (scheduler already shut down or watch channel error).")]
SignalFailed,
#[error("Timed out waiting for scheduler tasks (Coordinator, Workers) to complete shutdown.")]
Timeout,
#[error("A worker or coordinator task panicked during the shutdown process.")]
TaskPanic, #[error("Shutdown already in progress or completed.")] AlreadyShuttingDown,
}