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