use std::sync::Arc;
use arc_swap::ArcSwap;
use crate::sink::SmallSinkVec;
use crate::{FoxgloveError, Sink};
pub(crate) const ERROR_LOGGING_MESSAGE: &str = "error logging message";
#[derive(Default)]
pub(crate) struct LogSinkSet(ArcSwap<SmallSinkVec>);
impl LogSinkSet {
pub fn new() -> Self {
Self::default()
}
pub fn is_empty(&self) -> bool {
self.0.load().is_empty()
}
#[cfg(all(test, feature = "websocket"))]
pub fn len(&self) -> usize {
self.0.load().len()
}
pub fn store(&self, sinks: SmallSinkVec) {
self.0.store(Arc::new(sinks));
}
pub fn for_each<F>(&self, mut f: F)
where
F: FnMut(&Arc<dyn Sink>) -> Result<(), FoxgloveError>,
{
for sink in self.0.load().iter() {
if let Err(err) = f(sink) {
tracing::warn!("{ERROR_LOGGING_MESSAGE}: {:?}", err);
}
}
}
pub fn for_each_filtered<F, P>(&self, predicate: P, mut f: F)
where
F: FnMut(&Arc<dyn Sink>) -> Result<(), FoxgloveError>,
P: Fn(&Arc<dyn Sink>) -> bool,
{
for sink in self.0.load().iter() {
if predicate(sink) {
if let Err(err) = f(sink) {
tracing::warn!("{ERROR_LOGGING_MESSAGE}: {:?}", err);
}
}
}
}
pub fn clear(&self) {
self.0.store(Arc::default());
}
}