#![allow(dead_code)]
use std::sync::{Arc, Mutex, MutexGuard, PoisonError};
use std::time::Duration;
use reliar_outbox::OutboxMetrics;
#[derive(Debug, Default)]
struct Inner {
pending: Option<u64>,
expired_pending: Option<u64>,
oldest_pending_age: Option<Duration>,
}
#[derive(Clone, Debug, Default)]
pub(crate) struct CountingMetrics {
inner: Arc<Mutex<Inner>>,
}
impl CountingMetrics {
fn lock(&self) -> MutexGuard<'_, Inner> {
self.inner.lock().unwrap_or_else(PoisonError::into_inner)
}
pub(crate) fn pending(&self) -> Option<u64> {
self.lock().pending
}
pub(crate) fn expired_pending(&self) -> Option<u64> {
self.lock().expired_pending
}
pub(crate) fn oldest_pending_age(&self) -> Option<Duration> {
self.lock().oldest_pending_age
}
}
impl OutboxMetrics for CountingMetrics {
fn pending(&self, n: u64) {
self.lock().pending = Some(n);
}
fn expired_pending(&self, n: u64) {
self.lock().expired_pending = Some(n);
}
fn oldest_pending_age(&self, age: Duration) {
self.lock().oldest_pending_age = Some(age);
}
}