use std::fmt;
use std::sync::Arc;
use std::time::Duration;
#[derive(Debug, Clone)]
pub enum Event {
Started {
job_id: uuid::Uuid,
kind: String,
version: i16,
attempt: i32,
},
Succeeded {
job_id: uuid::Uuid,
attempt: i32,
duration: Duration,
},
Retried {
job_id: uuid::Uuid,
attempt: i32,
duration: Duration,
message: String,
next_run_at: chrono::DateTime<chrono::Utc>,
},
Failed {
job_id: uuid::Uuid,
attempt: i32,
duration: Duration,
message: String,
reason: FailReason,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FailReason {
Permanent,
Exhausted,
Malformed,
Unknown,
Panic,
Timeout,
}
impl fmt::Display for FailReason {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Permanent => f.write_str("permanent"),
Self::Exhausted => f.write_str("exhausted"),
Self::Malformed => f.write_str("malformed"),
Self::Unknown => f.write_str("unknown"),
Self::Panic => f.write_str("panic"),
Self::Timeout => f.write_str("timeout"),
}
}
}
pub trait Observer: Send + Sync + 'static {
fn observe(&self, _event: &Event) {}
}
pub type SharedObserver = Arc<dyn Observer>;
#[derive(Debug, Default, Clone, Copy)]
pub struct NoopObserver;
impl Observer for NoopObserver {}