cala_server/job/
registry.rs1use std::collections::HashMap;
2
3use cala_ledger::CalaLedger;
4
5use super::{entity::*, error::JobError, traits::*};
6
7pub struct JobRegistry {
8 ledger: CalaLedger,
9 initializers: HashMap<JobType, Box<dyn JobInitializer>>,
10 retry_settings: HashMap<JobType, RetrySettings>,
11}
12
13impl JobRegistry {
14 pub(crate) fn new(ledger: &CalaLedger) -> Self {
15 Self {
16 ledger: ledger.clone(),
17 initializers: HashMap::new(),
18 retry_settings: HashMap::new(),
19 }
20 }
21
22 pub fn add_initializer<I: JobInitializer + Default>(&mut self) {
23 let job_type = <I as JobInitializer>::job_type();
24 assert!(
25 !self.initializers.contains_key(&job_type),
26 "Job initializer {} already exists",
27 job_type
28 );
29
30 self.initializers
31 .insert(<I as JobInitializer>::job_type(), Box::<I>::default());
32 self.retry_settings.insert(
33 <I as JobInitializer>::job_type(),
34 <I as JobInitializer>::retry_on_error_settings(),
35 );
36 }
37
38 pub(super) fn initializer_exists(&self, job_type: &JobType) -> bool {
39 self.initializers.contains_key(job_type)
40 }
41
42 pub(super) fn init_job(&self, job: Job) -> Result<Box<dyn JobRunner>, JobError> {
43 self.initializers
44 .get(&job.job_type)
45 .ok_or(JobError::NoInitializerPresent)?
46 .init(job, &self.ledger)
47 .map_err(|e| JobError::JobInitError(e.to_string()))
48 }
49
50 pub(super) fn retry_settings(&self, job_type: &JobType) -> &RetrySettings {
51 self.retry_settings
52 .get(job_type)
53 .expect("Retry settings not found")
54 }
55}