use parking_lot::Mutex;
use std::io::{self, Write};
use std::sync::Arc;
use crate::events::envelope::EventEnvelope;
pub trait EventSink: Send + Sync {
fn emit(&self, ev: &EventEnvelope);
fn flush(&self);
}
pub struct NullSink;
impl EventSink for NullSink {
fn emit(&self, _ev: &EventEnvelope) {}
fn flush(&self) {}
}
pub struct NdjsonStdoutSink {
lock: Mutex<()>,
}
impl Default for NdjsonStdoutSink {
fn default() -> Self {
Self {
lock: Mutex::new(()),
}
}
}
impl NdjsonStdoutSink {
pub fn create() -> Self {
Self::default()
}
}
impl EventSink for NdjsonStdoutSink {
fn emit(&self, ev: &EventEnvelope) {
let _g = self.lock.lock();
let stdout = io::stdout();
let mut h = stdout.lock();
let _ = h.write_all(ev.to_ndjson_line().as_bytes());
}
fn flush(&self) {
let _ = io::stdout().lock().flush();
}
}
#[derive(Default)]
pub struct MemorySink {
pub events: Mutex<Vec<EventEnvelope>>,
}
impl MemorySink {
pub fn create() -> Self {
Self::default()
}
pub fn take(&self) -> Vec<EventEnvelope> {
std::mem::take(&mut *self.events.lock())
}
}
impl EventSink for MemorySink {
fn emit(&self, ev: &EventEnvelope) {
self.events.lock().push(ev.clone());
}
fn flush(&self) {}
}
pub type DynSink = Arc<dyn EventSink>;