evergreen/common/trigger/
event.rs1use crate as eg;
2use eg::result::{EgError, EgResult};
3use eg::EgValue;
4use std::fmt;
5
6#[derive(Debug, Clone, Copy, PartialEq)]
7pub enum EventState {
8 Pending,
9 Collecting,
10 Collected,
11 Validating,
12 Valid,
13 Invalid,
14 Reacting,
15 Reacted,
16 Cleaning,
17 Complete,
18 Error,
19}
20
21impl TryFrom<&str> for EventState {
28 type Error = EgError;
29 fn try_from(value: &str) -> Result<Self, EgError> {
30 match value {
31 "pending" => Ok(Self::Pending),
32 "collecting" => Ok(Self::Collecting),
33 "collected" => Ok(Self::Collected),
34 "validating" => Ok(Self::Validating),
35 "valid" => Ok(Self::Valid),
36 "invalid" => Ok(Self::Invalid),
37 "reacting" => Ok(Self::Reacting),
38 "reacted" => Ok(Self::Reacted),
39 "cleaning" => Ok(Self::Cleaning),
40 "complete" => Ok(Self::Complete),
41 "error" => Ok(Self::Error),
42 _ => Err(format!("Invalid Trigger Event State: {value}").into()),
43 }
44 }
45}
46
47impl From<EventState> for &'static str {
48 fn from(state: EventState) -> &'static str {
49 match state {
50 EventState::Pending => "pending",
51 EventState::Collecting => "collecting",
52 EventState::Collected => "collected",
53 EventState::Validating => "validating",
54 EventState::Valid => "valid",
55 EventState::Invalid => "invalid",
56 EventState::Reacting => "reacting",
57 EventState::Reacted => "reacted",
58 EventState::Cleaning => "cleaning",
59 EventState::Complete => "complete",
60 EventState::Error => "error",
61 }
62 }
63}
64
65pub struct Event {
66 id: i64,
67 event_def: i64,
68 state: EventState,
69 target: EgValue,
70 target_pkey: EgValue,
71 group_value: Option<EgValue>,
72 user_data: Option<EgValue>,
73}
74
75impl fmt::Display for Event {
76 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77 write!(f, "A/T Event id={}", self.id)
78 }
79}
80
81impl Event {
82 pub fn from_source(source: EgValue) -> EgResult<Event> {
84 let state: EventState = source["state"].as_str().unwrap().try_into()?;
86
87 let id = source.id()?;
88 let event_def = source["event_def"].int()?;
89
90 let user_data = if let Some(data) = source["user_data"].as_str() {
91 match EgValue::parse(data) {
92 Ok(d) => Some(d),
93 Err(e) => {
94 return Err(format!("Invalid user data for event {id}: {e} {data}").into())
95 }
96 }
97 } else {
98 None
99 };
100
101 Ok(Event {
102 id,
103 event_def,
104 state,
105 user_data,
106 group_value: None,
107 target_pkey: source["target"].clone(),
108 target: EgValue::Null,
109 })
110 }
111
112 pub fn id(&self) -> i64 {
113 self.id
114 }
115 pub fn event_def(&self) -> i64 {
116 self.event_def
117 }
118 pub fn target(&self) -> &EgValue {
119 &self.target
120 }
121 pub fn set_target(&mut self, target: EgValue) {
122 self.target = target
123 }
124
125 pub fn target_pkey(&self) -> &EgValue {
127 &self.target_pkey
128 }
129 pub fn state(&self) -> EventState {
130 self.state
131 }
132 pub fn set_state(&mut self, state: EventState) {
133 self.state = state;
134 }
135 pub fn user_data(&self) -> Option<&EgValue> {
136 self.user_data.as_ref()
137 }
138 pub fn group_value(&self) -> Option<&EgValue> {
139 self.group_value.as_ref()
140 }
141 pub fn set_group_value(&mut self, value: EgValue) {
142 self.group_value = Some(value);
143 }
144}