evergreen/common/trigger/reactor/
mod.rs

1//! Base module for A/T Reactors
2use crate::common::trigger::{Event, EventState, Processor};
3use crate::result::EgResult;
4
5mod circ;
6
7/// Add reactor routines to the Processor.
8impl Processor<'_> {
9    /// React to one or more events.
10    ///
11    /// Multiple Events implies a linked event group.
12    ///
13    /// Reactors in Perl return true/false to indicate success,
14    /// but the return value doesn't appear to be used, just the
15    /// event state.
16    pub fn react(&mut self, events: &mut [&mut Event]) -> EgResult<()> {
17        let event_ids: Vec<String> = events.iter().map(|e| e.id().to_string()).collect();
18
19        log::info!("{self} reacting to events [{}]", event_ids.join(","));
20
21        if events.is_empty() {
22            return Ok(());
23        }
24
25        for event in events.iter_mut() {
26            self.set_event_state(event, EventState::Reacting)?;
27        }
28
29        let reactor = self.reactor();
30
31        log::debug!(
32            "{self} reacting with '{reactor}' on {} event(s)",
33            events.len()
34        );
35
36        let react_result = match reactor {
37            "NOOP_True" => Ok(()),
38            "NOOP_False" => Err("NOOP_False".to_string().into()),
39            "Circ::AutoRenew" => self.autorenew(events),
40            _ => Err(format!("No such reactor: {reactor}").into()),
41        };
42
43        if react_result.is_ok() {
44            for event in events.iter_mut() {
45                self.set_event_state(event, EventState::Reacted)?;
46            }
47        }
48
49        react_result
50    }
51}