use std::sync::mpsc::{self, Receiver, Sender};
use agentkit_loop::{AgentEvent, LoopObserver};
use crate::ReportError;
use crate::policy::FallibleObserver;
pub struct ChannelReporter {
sender: std::sync::Mutex<Sender<AgentEvent>>,
}
impl ChannelReporter {
pub fn new(sender: Sender<AgentEvent>) -> Self {
Self {
sender: std::sync::Mutex::new(sender),
}
}
pub fn pair() -> (Self, Receiver<AgentEvent>) {
let (sender, receiver) = mpsc::channel();
(Self::new(sender), receiver)
}
}
impl LoopObserver for ChannelReporter {
fn handle_event(&self, event: AgentEvent) {
let _ = self.sender.lock().unwrap_or_else(|e| e.into_inner()).send(event);
}
}
impl FallibleObserver for ChannelReporter {
fn try_handle_event(&self, event: &AgentEvent) -> Result<(), ReportError> {
self.sender
.lock()
.unwrap_or_else(|e| e.into_inner())
.send(event.clone())
.map_err(|_| ReportError::ChannelSend)
}
}