use crate::{EventReporter, EventSender};
use std::error;
use std::fmt::{Debug, Display, Formatter};
pub struct ChannelReporter<Event> {
event_sender: EventSender<Event>,
}
impl<Event> ChannelReporter<Event> {
pub fn new(event_sender: EventSender<Event>) -> Self {
Self { event_sender }
}
}
impl<Event> EventReporter for ChannelReporter<Event> {
type Event = Event;
type Err = EventReporterError<Event>;
fn report_event(&self, event: impl Into<Self::Event>) -> Result<(), Self::Err> {
self.event_sender
.send(event.into())
.map_err(EventReporterError::SendError)
}
#[allow(clippy::unit_arg)]
fn disconnect(self) -> Result<(), Self::Err> {
Ok(self.event_sender.disconnect())
}
}
pub enum EventReporterError<Event> {
SendError(crate::EventSendError<Event>),
}
impl<Event> Debug for EventReporterError<Event> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::SendError(_) => f.write_fmt(format_args!(
"SendError(EventSendError({}))",
std::any::type_name::<Event>()
)),
}
}
}
impl<Event> Display for EventReporterError<Event>
where
Event: Display,
{
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::SendError(crate::EventSendError(ev)) => f.write_fmt(format_args!(
"SendError(EventSendError({} = '{}'))",
std::any::type_name::<Event>(),
ev
)),
}
}
}
impl<Event> error::Error for EventReporterError<Event> where Event: Display {}