swink_agent/agent/
events.rs1use std::sync::Arc;
2
3use tracing::warn;
4
5use crate::loop_::AgentEvent;
6
7use super::{Agent, SubscriptionId};
8
9impl Agent {
10 pub fn subscribe(
12 &mut self,
13 callback: impl Fn(&AgentEvent) + Send + Sync + 'static,
14 ) -> SubscriptionId {
15 self.listeners.subscribe(callback)
16 }
17
18 pub fn unsubscribe(&mut self, id: SubscriptionId) -> bool {
20 self.listeners.unsubscribe(id)
21 }
22
23 pub(super) fn dispatch_event(&mut self, event: &AgentEvent) {
27 self.listeners.dispatch(event);
28
29 for forwarder in &self.event_forwarders {
30 let guarded = std::panic::AssertUnwindSafe(|| forwarder(event.clone()));
31 if let Err(error) = std::panic::catch_unwind(guarded) {
32 warn!("event forwarder panicked: {error:?}");
33 }
34 }
35 }
36
37 pub fn add_event_forwarder(&mut self, f: impl Fn(AgentEvent) + Send + Sync + 'static) {
39 self.event_forwarders.push(Arc::new(f));
40 }
41
42 pub fn forward_event(&mut self, event: &AgentEvent) {
46 self.dispatch_event(event);
47 }
48
49 pub fn emit(&mut self, name: impl Into<String>, payload: serde_json::Value) {
51 let event = AgentEvent::Custom(crate::emit::Emission::new(name, payload));
52 self.dispatch_event(&event);
53 }
54}