Skip to main content

iii_sdk/
triggers.rs

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}