use std::error::Error;
use std::fmt;
use crate::{
BoxFuture, ExecutionCorrelation, FailureSummary, JobParameters, StopToken,
TaskletExecutionOutcome,
};
#[derive(Clone, Copy, Debug)]
pub struct ListenerContext<'a> {
correlation: &'a ExecutionCorrelation,
parameters: &'a JobParameters,
stop: &'a StopToken,
}
impl<'a> ListenerContext<'a> {
pub(crate) const fn new(
correlation: &'a ExecutionCorrelation,
parameters: &'a JobParameters,
stop: &'a StopToken,
) -> Self {
Self {
correlation,
parameters,
stop,
}
}
#[must_use]
pub const fn correlation(&self) -> &'a ExecutionCorrelation {
self.correlation
}
#[must_use]
pub const fn parameters(&self) -> &'a JobParameters {
self.parameters
}
#[must_use]
pub const fn stop_token(&self) -> &'a StopToken {
self.stop
}
}
pub trait JobExecutionListener: Send + Sync {
fn before_job<'a>(
&'a self,
context: ListenerContext<'a>,
) -> BoxFuture<'a, Result<(), ListenerError>>;
fn after_job<'a>(
&'a self,
context: ListenerContext<'a>,
outcome: TaskletExecutionOutcome,
) -> BoxFuture<'a, Result<(), ListenerError>>;
}
pub trait StepExecutionListener: Send + Sync {
fn before_step<'a>(
&'a self,
context: ListenerContext<'a>,
) -> BoxFuture<'a, Result<(), ListenerError>>;
fn after_step<'a>(
&'a self,
context: ListenerContext<'a>,
outcome: TaskletExecutionOutcome,
) -> BoxFuture<'a, Result<(), ListenerError>>;
}
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct ListenerError;
impl ListenerError {
#[must_use]
pub const fn new() -> Self {
Self
}
#[must_use]
pub fn from_error(error: impl Error + Send + Sync + 'static) -> Self {
drop(error);
Self
}
}
impl fmt::Display for ListenerError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("the execution listener failed")
}
}
impl Error for ListenerError {}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[non_exhaustive]
pub enum ListenerPhase {
BeforeJob,
BeforeStep,
AfterStep,
AfterJob,
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[non_exhaustive]
pub enum ListenerFailureKind {
Error,
Panic,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ListenerFailure {
phase: ListenerPhase,
registration_index: usize,
kind: ListenerFailureKind,
summary: FailureSummary,
}
impl ListenerFailure {
pub(crate) const fn new(
phase: ListenerPhase,
registration_index: usize,
kind: ListenerFailureKind,
summary: FailureSummary,
) -> Self {
Self {
phase,
registration_index,
kind,
summary,
}
}
#[must_use]
pub const fn phase(self) -> ListenerPhase {
self.phase
}
#[must_use]
pub const fn registration_index(self) -> usize {
self.registration_index
}
#[must_use]
pub const fn kind(self) -> ListenerFailureKind {
self.kind
}
#[must_use]
pub const fn summary(self) -> FailureSummary {
self.summary
}
}