use std::sync::Arc;
use crate::queue::BoundedQueue;
pub(crate) enum DataHandler<T> {
Queue(Arc<BoundedQueue<T>>),
Callback(Arc<dyn Fn(T) + Send + Sync>),
#[allow(dead_code)]
QueueWithNotifier {
queue: Arc<BoundedQueue<T>>,
notifier: Arc<dyn Fn() + Send + Sync>,
},
}
impl<T> DataHandler<T> {
pub(crate) fn handle(&self, data: T) {
match self {
DataHandler::Queue(queue) => {
if queue.push(data) {
tracing::debug!("Queue full, dropped oldest message");
}
}
DataHandler::Callback(cb) => cb(data),
DataHandler::QueueWithNotifier { queue, notifier } => {
if queue.push(data) {
tracing::debug!("Queue full, dropped oldest message");
}
notifier();
}
}
}
}