use crate::Event;
use parking_lot::Mutex;
use std::any::TypeId;
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::Instant;
pub(crate) struct EventMetricsCounters {
pub(crate) event_name: &'static str,
pub(crate) type_id: TypeId,
pub(crate) dispatch_count: AtomicU64,
pub(crate) last_dispatch: Mutex<Instant>,
}
impl EventMetricsCounters {
pub(crate) fn new<T: Event>() -> Self {
Self {
event_name: std::any::type_name::<T>(),
type_id: TypeId::of::<T>(),
dispatch_count: AtomicU64::new(0),
last_dispatch: Mutex::new(Instant::now()),
}
}
pub(crate) fn record_dispatch(&self) {
let _previous = self.dispatch_count.fetch_add(1, Ordering::Relaxed);
*self.last_dispatch.lock() = Instant::now();
}
pub(crate) fn snapshot(&self) -> EventMetadata {
EventMetadata {
event_name: self.event_name,
type_id: self.type_id,
last_dispatch: *self.last_dispatch.lock(),
dispatch_count: self.dispatch_count.load(Ordering::Relaxed),
listener_count: 0,
}
}
}
#[derive(Debug, Clone)]
pub struct EventMetadata {
pub event_name: &'static str,
pub type_id: TypeId,
pub last_dispatch: Instant,
pub dispatch_count: u64,
pub listener_count: usize,
}
impl EventMetadata {
#[must_use]
pub fn time_since_last_dispatch(&self) -> std::time::Duration {
self.last_dispatch.elapsed()
}
}