use std::sync::atomic::{AtomicUsize, Ordering};
use idiolect_records::{IdiolectFamily, RecordFamily};
use crate::error::IndexerError;
use crate::event::{IndexerAction, IndexerEvent};
#[allow(async_fn_in_trait)]
pub trait RecordHandler<F: RecordFamily = IdiolectFamily>: Send + Sync {
async fn handle(&self, event: &IndexerEvent<F>) -> Result<(), IndexerError>;
}
#[derive(Debug, Default)]
pub struct NoopRecordHandler {
observed: AtomicUsize,
deletes: AtomicUsize,
}
impl NoopRecordHandler {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn observed(&self) -> usize {
self.observed.load(Ordering::SeqCst)
}
#[must_use]
pub fn deletes(&self) -> usize {
self.deletes.load(Ordering::SeqCst)
}
}
impl<F: RecordFamily, T: RecordHandler<F> + ?Sized> RecordHandler<F> for std::sync::Arc<T> {
async fn handle(&self, event: &IndexerEvent<F>) -> Result<(), IndexerError> {
(**self).handle(event).await
}
}
impl<F: RecordFamily> RecordHandler<F> for NoopRecordHandler {
async fn handle(&self, event: &IndexerEvent<F>) -> Result<(), IndexerError> {
self.observed.fetch_add(1, Ordering::SeqCst);
if event.action == IndexerAction::Delete {
self.deletes.fetch_add(1, Ordering::SeqCst);
}
Ok(())
}
}