bronzeflow_core/manager/
mod.rs

1use crate::prelude::{Executor, StorageType, Trigger};
2use crate::service::Service;
3use crate::store::Storage;
4
5use crate::task::RunnableHolder;
6use std::sync::{Arc, Mutex};
7
8pub struct ScheduleManager<SG: Storage + 'static, TG: Trigger + 'static, E: Executor + 'static> {
9    storage: StorageType<SG>,
10    trigger: Arc<Mutex<TG>>,
11    executor: Arc<Mutex<E>>,
12}
13
14impl<SG: Storage, TG: Trigger, E: Executor> ScheduleManager<SG, TG, E> {
15    pub fn new(storage: SG, trigger: TG, executor: E) -> Self {
16        // let storage: StorageType = MemoryStorage::new().into();
17        ScheduleManager {
18            storage: Arc::new(Mutex::new(storage)),
19            executor: Arc::new(Mutex::new(executor)),
20            trigger: Arc::new(Mutex::new(trigger)),
21        }
22    }
23
24    pub fn add_runnable(&mut self, runnable: RunnableHolder) {
25        self.storage.lock().unwrap().save_runnable(runnable)
26    }
27
28    fn start_loader(&mut self) {
29        let storage = Arc::clone(&self.storage);
30        let trigger = Arc::clone(&self.executor);
31        self.trigger.lock().unwrap().trigger(storage, trigger);
32    }
33}
34
35impl<SG: Storage, TG: Trigger, E: Executor> Service for ScheduleManager<SG, TG, E> {
36    fn start(&mut self) {
37        self.start_loader();
38    }
39
40    fn stop(&mut self) {
41        self.trigger.lock().unwrap().stop();
42    }
43}