use std::sync::Arc;
use crate::IntoF64;
pub trait CounterFn {
fn increment(&self, value: u64);
fn absolute(&self, value: u64);
}
pub trait GaugeFn {
fn increment(&self, value: f64);
fn decrement(&self, value: f64);
fn set(&self, value: f64);
}
pub trait HistogramFn {
fn record(&self, value: f64);
}
#[derive(Clone)]
pub struct Counter {
inner: Option<Arc<dyn CounterFn + Send + Sync>>,
}
#[derive(Clone)]
pub struct Gauge {
inner: Option<Arc<dyn GaugeFn + Send + Sync>>,
}
#[derive(Clone)]
pub struct Histogram {
inner: Option<Arc<dyn HistogramFn + Send + Sync>>,
}
impl Counter {
pub fn noop() -> Self {
Self { inner: None }
}
pub fn from_arc<F: CounterFn + Send + Sync + 'static>(a: Arc<F>) -> Self {
Self { inner: Some(a) }
}
pub fn increment(&self, value: u64) {
if let Some(c) = &self.inner {
c.increment(value)
}
}
pub fn absolute(&self, value: u64) {
if let Some(c) = &self.inner {
c.absolute(value)
}
}
}
impl Gauge {
pub fn noop() -> Self {
Self { inner: None }
}
pub fn from_arc<F: GaugeFn + Send + Sync + 'static>(a: Arc<F>) -> Self {
Self { inner: Some(a) }
}
pub fn increment<T: IntoF64>(&self, value: T) {
if let Some(g) = &self.inner {
g.increment(value.into_f64())
}
}
pub fn decrement<T: IntoF64>(&self, value: T) {
if let Some(g) = &self.inner {
g.decrement(value.into_f64())
}
}
pub fn set<T: IntoF64>(&self, value: T) {
if let Some(g) = &self.inner {
g.set(value.into_f64())
}
}
}
impl Histogram {
pub fn noop() -> Self {
Self { inner: None }
}
pub fn from_arc<F: HistogramFn + Send + Sync + 'static>(a: Arc<F>) -> Self {
Self { inner: Some(a) }
}
pub fn record<T: IntoF64>(&self, value: T) {
if let Some(ref inner) = self.inner {
inner.record(value.into_f64())
}
}
}
impl<T> CounterFn for Arc<T>
where
T: CounterFn,
{
fn increment(&self, value: u64) {
(**self).increment(value)
}
fn absolute(&self, value: u64) {
(**self).absolute(value)
}
}
impl<T> GaugeFn for Arc<T>
where
T: GaugeFn,
{
fn increment(&self, value: f64) {
(**self).increment(value)
}
fn decrement(&self, value: f64) {
(**self).decrement(value)
}
fn set(&self, value: f64) {
(**self).set(value)
}
}
impl<T> HistogramFn for Arc<T>
where
T: HistogramFn,
{
fn record(&self, value: f64) {
(**self).record(value);
}
}
impl<T> From<Arc<T>> for Counter
where
T: CounterFn + Send + Sync + 'static,
{
fn from(inner: Arc<T>) -> Self {
Counter::from_arc(inner)
}
}
impl<T> From<Arc<T>> for Gauge
where
T: GaugeFn + Send + Sync + 'static,
{
fn from(inner: Arc<T>) -> Self {
Gauge::from_arc(inner)
}
}
impl<T> From<Arc<T>> for Histogram
where
T: HistogramFn + Send + Sync + 'static,
{
fn from(inner: Arc<T>) -> Self {
Histogram::from_arc(inner)
}
}