Skip to main content

ops_rs/trigger/
registry.rs

1use std::collections::HashMap;
2
3use crate::{OpError, OpResult, Trigger};
4
5/// A factory function that creates a Trigger instance
6pub type TriggerFactory = Box<dyn Fn() -> Box<dyn Trigger> + Send + Sync>;
7
8/// Registry for mapping task type names to their corresponding operations
9pub struct TriggerRegistry {
10    factories: HashMap<String, TriggerFactory>,
11}
12
13impl TriggerRegistry {
14    /// Create a new empty registry
15    pub fn new() -> Self {
16        Self {
17            factories: HashMap::new(),
18        }
19    }
20
21    /// Set a trigger with its corresponding operation factory
22    pub fn set<T>(&mut self, factory: T) -> OpResult<()>
23    where
24        T: Fn() -> Box<dyn Trigger> + Send + Sync + 'static,
25    {
26        let temp_trigger = (factory)();
27        let trigger_name = temp_trigger.name();
28        if self.factories.contains_key(&trigger_name) {
29            return Err(OpError::Trigger(format!(
30                "Trigger type {} is already registered",
31                trigger_name
32            )));
33        }
34        self.factories.insert(trigger_name, Box::new(factory));
35        Ok(())
36    }
37
38    /// Create a Trigger instance for a trigger type
39    pub fn spawn(&self, trigger_name: &str) -> std::result::Result<Box<dyn Trigger>, String> {
40        match self.factories.get(trigger_name) {
41            Some(factory) => Ok(factory()),
42            None => Err(format!(
43                "No trigger registered for trigger name: {}, Registered triggers: {:?}",
44                trigger_name,
45                self.list_names()
46            )),
47        }
48    }
49
50    /// Create all registered triggers
51    pub fn spawn_all(&self) -> Vec<Box<dyn Trigger>> {
52        self.factories.values().map(|factory| (factory)()).collect()
53    }
54
55    /// Get all set triggers
56    pub fn list_names(&self) -> Vec<String> {
57        self.factories.keys().cloned().collect()
58    }
59
60    pub fn list(&self) -> Vec<String> {
61        self.list_names()
62    }
63
64    /// Check if a trigger is set
65    pub fn is_set(&self, trigger_name: &str) -> bool {
66        self.factories.contains_key(trigger_name)
67    }
68
69    /// Remove a set trigger
70    pub fn unregister(&mut self, trigger_name: &str) -> bool {
71        self.factories.remove(trigger_name).is_some()
72    }
73}
74
75impl std::fmt::Debug for TriggerRegistry {
76    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77        f.debug_struct("TriggerRegistry")
78            .field("triggers_set", &self.list_names())
79            .finish()
80    }
81}