Skip to main content

roder_tasks/
registry.rs

1use std::collections::BTreeMap;
2use std::sync::Arc;
3
4use roder_api::extension::TaskExecutorId;
5use roder_api::tasks::{TaskExecutor, TaskSpec};
6
7#[derive(Default, Clone)]
8pub struct TaskExecutorRegistry {
9    executors: BTreeMap<TaskExecutorId, Arc<dyn TaskExecutor>>,
10}
11
12impl TaskExecutorRegistry {
13    pub fn register(&mut self, executor: Arc<dyn TaskExecutor>) -> anyhow::Result<()> {
14        let id = executor.id();
15        if self.executors.contains_key(&id) {
16            anyhow::bail!("task executor {id:?} is already registered");
17        }
18        self.executors.insert(id, executor);
19        Ok(())
20    }
21
22    pub fn get(&self, id: &str) -> Option<Arc<dyn TaskExecutor>> {
23        self.executors.get(id).cloned()
24    }
25
26    pub fn specs(&self) -> Vec<TaskSpec> {
27        self.executors
28            .values()
29            .map(|executor| executor.spec())
30            .collect()
31    }
32
33    pub fn is_empty(&self) -> bool {
34        self.executors.is_empty()
35    }
36}