ergo_runtime/trigger/implementations/emit_if_event_and_true/
impl.rs1use std::collections::HashMap;
2
3use crate::trigger::{TriggerEvent, TriggerPrimitive, TriggerPrimitiveManifest, TriggerValue};
4
5use super::manifest::emit_if_event_and_true_manifest;
6
7pub struct EmitIfEventAndTrue {
8 manifest: TriggerPrimitiveManifest,
9}
10
11impl EmitIfEventAndTrue {
12 pub fn new() -> Self {
13 Self {
14 manifest: emit_if_event_and_true_manifest(),
15 }
16 }
17}
18
19impl Default for EmitIfEventAndTrue {
20 fn default() -> Self {
21 Self::new()
22 }
23}
24
25impl TriggerPrimitive for EmitIfEventAndTrue {
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 event = inputs
36 .get("event")
37 .and_then(|v| v.as_event())
38 .expect("missing required event input 'event'");
39 let condition = inputs
40 .get("condition")
41 .and_then(|v| v.as_bool())
42 .expect("missing required bool input 'condition'");
43
44 let gated_event = if matches!(event, TriggerEvent::Emitted) && condition {
45 TriggerEvent::Emitted
46 } else {
47 TriggerEvent::NotEmitted
48 };
49
50 HashMap::from([("event".to_string(), TriggerValue::Event(gated_event))])
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 fn expect_panic<F: FnOnce() -> R + std::panic::UnwindSafe, R>(f: F) {
59 assert!(std::panic::catch_unwind(f).is_err());
60 }
61
62 #[test]
63 fn emits_when_event_emitted_and_condition_true() {
64 let trigger = EmitIfEventAndTrue::new();
65 let outputs = trigger.evaluate(
66 &HashMap::from([
67 (
68 "event".to_string(),
69 TriggerValue::Event(TriggerEvent::Emitted),
70 ),
71 ("condition".to_string(), TriggerValue::Bool(true)),
72 ]),
73 &HashMap::new(),
74 );
75 assert_eq!(
76 outputs.get("event"),
77 Some(&TriggerValue::Event(TriggerEvent::Emitted))
78 );
79 }
80
81 #[test]
82 fn suppresses_when_event_not_emitted() {
83 let trigger = EmitIfEventAndTrue::new();
84 let outputs = trigger.evaluate(
85 &HashMap::from([
86 (
87 "event".to_string(),
88 TriggerValue::Event(TriggerEvent::NotEmitted),
89 ),
90 ("condition".to_string(), TriggerValue::Bool(true)),
91 ]),
92 &HashMap::new(),
93 );
94 assert_eq!(
95 outputs.get("event"),
96 Some(&TriggerValue::Event(TriggerEvent::NotEmitted))
97 );
98 }
99
100 #[test]
101 fn suppresses_when_condition_false() {
102 let trigger = EmitIfEventAndTrue::new();
103 let outputs = trigger.evaluate(
104 &HashMap::from([
105 (
106 "event".to_string(),
107 TriggerValue::Event(TriggerEvent::Emitted),
108 ),
109 ("condition".to_string(), TriggerValue::Bool(false)),
110 ]),
111 &HashMap::new(),
112 );
113 assert_eq!(
114 outputs.get("event"),
115 Some(&TriggerValue::Event(TriggerEvent::NotEmitted))
116 );
117 }
118
119 #[test]
120 fn missing_event_panics() {
121 let trigger = EmitIfEventAndTrue::new();
122 expect_panic(|| {
123 trigger.evaluate(
124 &HashMap::from([("condition".to_string(), TriggerValue::Bool(true))]),
125 &HashMap::new(),
126 );
127 });
128 }
129
130 #[test]
131 fn missing_condition_panics() {
132 let trigger = EmitIfEventAndTrue::new();
133 expect_panic(|| {
134 trigger.evaluate(
135 &HashMap::from([(
136 "event".to_string(),
137 TriggerValue::Event(TriggerEvent::Emitted),
138 )]),
139 &HashMap::new(),
140 );
141 });
142 }
143
144 #[test]
145 fn wrong_event_type_panics() {
146 let trigger = EmitIfEventAndTrue::new();
147 expect_panic(|| {
148 trigger.evaluate(
149 &HashMap::from([
150 ("event".to_string(), TriggerValue::Bool(true)),
151 ("condition".to_string(), TriggerValue::Bool(true)),
152 ]),
153 &HashMap::new(),
154 );
155 });
156 }
157
158 #[test]
159 fn wrong_condition_type_panics() {
160 let trigger = EmitIfEventAndTrue::new();
161 expect_panic(|| {
162 trigger.evaluate(
163 &HashMap::from([
164 (
165 "event".to_string(),
166 TriggerValue::Event(TriggerEvent::Emitted),
167 ),
168 (
169 "condition".to_string(),
170 TriggerValue::Event(TriggerEvent::Emitted),
171 ),
172 ]),
173 &HashMap::new(),
174 );
175 });
176 }
177}