ops_rs/trigger/
registry.rs1use std::collections::HashMap;
2
3use crate::{OpError, OpResult, Trigger};
4
5pub type TriggerFactory = Box<dyn Fn() -> Box<dyn Trigger> + Send + Sync>;
7
8pub struct TriggerRegistry {
10 factories: HashMap<String, TriggerFactory>,
11}
12
13impl TriggerRegistry {
14 pub fn new() -> Self {
16 Self {
17 factories: HashMap::new(),
18 }
19 }
20
21 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 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 pub fn spawn_all(&self) -> Vec<Box<dyn Trigger>> {
52 self.factories.values().map(|factory| (factory)()).collect()
53 }
54
55 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 pub fn is_set(&self, trigger_name: &str) -> bool {
66 self.factories.contains_key(trigger_name)
67 }
68
69 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}