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::{JobContext, JobDeadLetterInfo, JobFailure};
8
9#[async_trait]
10pub trait JobHandler: Send + Sync {
11    fn job_type(&self) -> JobType<'static>;
12    async fn execute(&self, context: JobContext, payload: Value) -> Result<(), JobFailure>;
13
14    async fn on_dead_letter(
15        &self,
16        _context: JobContext,
17        _payload: Value,
18        _dead_letter: JobDeadLetterInfo,
19    ) {
20    }
21}
22
23pub trait JobHandlerRegistry {
24    fn register_boxed(&mut self, handler: Arc<dyn JobHandler>);
25
26    fn register<H>(&mut self, handler: H)
27    where
28        Self: Sized,
29        H: JobHandler + 'static,
30    {
31        self.register_boxed(Arc::new(handler));
32    }
33}