use crate::{
atomic::AtomicInt,
clear::Clear,
metric::{Gauge, Metric},
};
use aspect::{Advice, Enter, OnResult};
use serde::Serialize;
use std::ops::Deref;
#[derive(Clone, Default, Debug, Serialize)]
pub struct InFlight<G: Gauge = AtomicInt<u64>>(pub G);
impl<G: Gauge, R> Metric<R> for InFlight<G> {}
impl<G: Gauge> Enter for InFlight<G> {
type E = ();
fn enter(&self) {
self.0.incr();
}
}
impl<G: Gauge, R> OnResult<R> for InFlight<G> {
fn leave_scope(&self, _: ()) -> Advice {
self.0.decr();
Advice::Return
}
}
impl<G: Gauge> Clear for InFlight<G> {
fn clear(&self) {
}
}
impl<G: Gauge> Deref for InFlight<G> {
type Target = G;
fn deref(&self) -> &Self::Target {
&self.0
}
}