Skip to main content

boson_runtime/registry/
ext.rs

1//! Extended methods on [`TaskRegistry`](super::TaskRegistry).
2
3use boson_core::{BosonError, Result};
4
5use super::TaskDescriptor;
6use super::TaskRegistry;
7
8impl TaskRegistry {
9    /// Look up a task by name, returning an error if not found.
10    ///
11    /// # Errors
12    ///
13    /// Returns [`BosonError::TaskNotFound`](boson_core::BosonError::TaskNotFound) when the name is absent.
14    pub fn get_or_err(&self, name: &str) -> Result<&'static TaskDescriptor> {
15        self.get(name)
16            .ok_or_else(|| BosonError::TaskNotFound(name.to_string()))
17    }
18
19    /// Task names in sorted order.
20    #[must_use]
21    pub fn sorted_task_names(&self) -> Vec<&str> {
22        let mut names = self.list();
23        names.sort_unstable();
24        names
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn empty_registry() {
34        let registry = TaskRegistry::new();
35        assert!(registry.is_empty());
36        assert!(registry.get("missing").is_none());
37    }
38
39    #[test]
40    fn auto_discover_runs() {
41        let _registry = TaskRegistry::auto_discover();
42    }
43
44    #[test]
45    fn get_or_err_not_found() {
46        let registry = TaskRegistry::new();
47        let err = registry.get_or_err("nonexistent").unwrap_err();
48        assert!(matches!(err, BosonError::TaskNotFound(_)));
49    }
50}