cala_server/job/
registry.rs

1use 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}