1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use std::collections::HashMap;

use cala_ledger::CalaLedger;

use super::{entity::*, error::JobError, traits::*};

pub struct JobRegistry {
    ledger: CalaLedger,
    initializers: HashMap<JobType, Box<dyn JobInitializer>>,
}

impl JobRegistry {
    pub(crate) fn new(ledger: &CalaLedger) -> Self {
        Self {
            ledger: ledger.clone(),
            initializers: HashMap::new(),
        }
    }

    pub fn add_initializer<I: JobInitializer + Default>(&mut self) {
        let job_type = <I as JobInitializer>::job_type();
        assert!(
            !self.initializers.contains_key(&job_type),
            "Job initializer {} already exists",
            job_type
        );

        self.initializers
            .insert(<I as JobInitializer>::job_type(), Box::<I>::default());
    }

    pub(super) fn initializer_exists(&self, job_type: &JobType) -> bool {
        self.initializers.contains_key(job_type)
    }

    pub(super) fn init_job(&self, job: Job) -> Result<Box<dyn JobRunner>, JobError> {
        self.initializers
            .get(&job.job_type)
            .ok_or(JobError::NoInitializerPresent)?
            .init(job, &self.ledger)
            .map_err(|e| JobError::JobInitError(e.to_string()))
    }
}