1use std::sync::Arc;
2
3use async_trait::async_trait;
4use serde_json::Value;
5
6use crate::error::IIIError;
7
8#[derive(Debug, Clone)]
9pub struct TriggerConfig {
10 pub id: String,
11 pub function_id: String,
12 pub config: Value,
13}
14
15#[async_trait]
16pub trait TriggerHandler: Send + Sync {
17 async fn register_trigger(&self, config: TriggerConfig) -> Result<(), IIIError>;
18 async fn unregister_trigger(&self, config: TriggerConfig) -> Result<(), IIIError>;
19}
20
21#[derive(Clone)]
22pub struct Trigger {
23 unregister_fn: Arc<dyn Fn() + Send + Sync>,
24}
25
26impl Trigger {
27 pub fn new(unregister_fn: Arc<dyn Fn() + Send + Sync>) -> Self {
28 Self { unregister_fn }
29 }
30
31 pub fn unregister(&self) {
32 (self.unregister_fn)();
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use std::sync::{
39 Arc,
40 atomic::{AtomicBool, Ordering},
41 };
42
43 use super::*;
44
45 #[test]
46 fn trigger_unregister_calls_closure() {
47 let called = Arc::new(AtomicBool::new(false));
48 let called_ref = called.clone();
49 let trigger = Trigger::new(Arc::new(move || {
50 called_ref.store(true, Ordering::SeqCst);
51 }));
52
53 trigger.unregister();
54
55 assert!(called.load(Ordering::SeqCst));
56 }
57}