use std::sync::atomic::{AtomicUsize, Ordering};
use crate::error::IndexerError;
use crate::event::{IndexerAction, IndexerEvent};
#[allow(async_fn_in_trait)]
pub trait RecordHandler: Send + Sync {
async fn handle(&self, event: &IndexerEvent) -> 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<T: RecordHandler + ?Sized> RecordHandler for std::sync::Arc<T> {
async fn handle(&self, event: &IndexerEvent) -> Result<(), IndexerError> {
(**self).handle(event).await
}
}
impl RecordHandler for NoopRecordHandler {
async fn handle(&self, event: &IndexerEvent) -> Result<(), IndexerError> {
self.observed.fetch_add(1, Ordering::SeqCst);
if event.action == IndexerAction::Delete {
self.deletes.fetch_add(1, Ordering::SeqCst);
}
Ok(())
}
}