use crate::session::{EventBroadcaster, EventKind};
pub trait Logger: Send + Sync {
fn log(&self, event: EventKind);
}
pub struct DbLogger {
broadcaster: EventBroadcaster,
}
impl DbLogger {
#[must_use]
pub const fn new(broadcaster: EventBroadcaster) -> Self {
Self { broadcaster }
}
}
impl Logger for DbLogger {
fn log(&self, event: EventKind) {
self.broadcaster.send(event);
}
}
pub struct TracingLogger;
impl Logger for TracingLogger {
fn log(&self, event: EventKind) {
if let EventKind::ProtocolMessage {
protocol,
direction,
message,
..
} = &event
{
tracing::trace!(?protocol, ?direction, "{}", message);
}
}
}
pub struct VecLogger {
events: std::sync::Mutex<Vec<EventKind>>,
}
impl Default for VecLogger {
fn default() -> Self {
Self::new()
}
}
impl VecLogger {
#[must_use]
pub const fn new() -> Self {
Self {
events: std::sync::Mutex::new(Vec::new()),
}
}
pub fn events(&self) -> Vec<EventKind> {
self.events
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner)
.clone()
}
}
impl Logger for VecLogger {
fn log(&self, event: EventKind) {
if let Ok(mut events) = self.events.lock() {
events.push(event);
}
}
}