Skip to main content

runledger_core/jobs/
handler.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4use serde_json::Value;
5
6use super::identifiers::JobType;
7use super::{JobCompletion, JobContext, JobDeadLetterInfo, JobFailure};
8
9#[async_trait]
10pub trait JobHandler: Send + Sync {
11    fn job_type(&self) -> JobType<'static>;
12    async fn execute(
13        &self,
14        context: JobContext,
15        payload: Value,
16    ) -> Result<JobCompletion, JobFailure>;
17
18    async fn on_dead_letter(
19        &self,
20        _context: JobContext,
21        _payload: Value,
22        _dead_letter: JobDeadLetterInfo,
23    ) {
24    }
25}
26
27pub trait JobHandlerRegistry {
28    fn register_boxed(&mut self, handler: Arc<dyn JobHandler>);
29
30    fn register<H>(&mut self, handler: H)
31    where
32        Self: Sized,
33        H: JobHandler + 'static,
34    {
35        self.register_boxed(Arc::new(handler));
36    }
37}