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}