ergo_runtime/trigger/implementations/emit_if_true/
impl.rs1use 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}