mod types;
pub use types::{GraphEvent, StreamMode};
use std::sync::{Arc, Mutex};
pub trait GraphEventSink: Send + Sync {
fn emit(&self, event: GraphEvent);
}
#[derive(Clone, Copy, Debug, Default)]
pub struct NoopSink;
impl GraphEventSink for NoopSink {
fn emit(&self, _event: GraphEvent) {}
}
#[derive(Clone, Default)]
pub struct CollectingSink {
events: Arc<Mutex<Vec<GraphEvent>>>,
}
impl CollectingSink {
pub fn new() -> Self {
Self::default()
}
pub fn events(&self) -> Vec<GraphEvent> {
self.events.lock().map(|g| g.clone()).unwrap_or_default()
}
pub fn len(&self) -> usize {
self.events.lock().map(|g| g.len()).unwrap_or(0)
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl GraphEventSink for CollectingSink {
fn emit(&self, event: GraphEvent) {
if let Ok(mut guard) = self.events.lock() {
guard.push(event);
}
}
}
#[cfg(test)]
mod test;