Skip to main content

ergo_runtime/trigger/implementations/emit_if_true/
impl.rs

1use std::collections::HashMap;
2
3use crate::trigger::{TriggerEvent, TriggerPrimitive, TriggerPrimitiveManifest, TriggerValue};
4
5use super::manifest::emit_if_true_manifest;
6
7pub struct EmitIfTrue {
8    manifest: TriggerPrimitiveManifest,
9}
10
11impl EmitIfTrue {
12    pub fn new() -> Self {
13        Self {
14            manifest: emit_if_true_manifest(),
15        }
16    }
17}
18
19impl Default for EmitIfTrue {
20    fn default() -> Self {
21        Self::new()
22    }
23}
24
25impl TriggerPrimitive for EmitIfTrue {
26    fn manifest(&self) -> &TriggerPrimitiveManifest {
27        &self.manifest
28    }
29
30    fn evaluate(
31        &self,
32        inputs: &HashMap<String, TriggerValue>,
33        _parameters: &HashMap<String, crate::trigger::ParameterValue>,
34    ) -> HashMap<String, TriggerValue> {
35        let should_emit = inputs
36            .get("input")
37            .and_then(|v| v.as_bool())
38            .expect("missing required bool input 'input'");
39
40        let event = if should_emit {
41            TriggerEvent::Emitted
42        } else {
43            TriggerEvent::NotEmitted
44        };
45
46        HashMap::from([("event".to_string(), TriggerValue::Event(event))])
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53
54    fn expect_panic<F: FnOnce() -> R + std::panic::UnwindSafe, R>(f: F) {
55        assert!(std::panic::catch_unwind(f).is_err());
56    }
57
58    #[test]
59    fn emits_only_on_true() {
60        let trigger = EmitIfTrue::new();
61        let outputs_true = trigger.evaluate(
62            &HashMap::from([("input".to_string(), TriggerValue::Bool(true))]),
63            &HashMap::new(),
64        );
65        assert_eq!(
66            outputs_true.get("event"),
67            Some(&TriggerValue::Event(TriggerEvent::Emitted))
68        );
69
70        let outputs_false = trigger.evaluate(
71            &HashMap::from([("input".to_string(), TriggerValue::Bool(false))]),
72            &HashMap::new(),
73        );
74        assert_eq!(
75            outputs_false.get("event"),
76            Some(&TriggerValue::Event(TriggerEvent::NotEmitted))
77        );
78    }
79
80    #[test]
81    fn missing_input_panics() {
82        let trigger = EmitIfTrue::new();
83        expect_panic(|| {
84            trigger.evaluate(&HashMap::new(), &HashMap::new());
85        });
86    }
87}