mod exemplar;
mod label_set;
mod value;
use std::time::Duration;
pub use self::{exemplar::*, label_set::*, value::*};
use crate::{
error::Result,
raw::{Metadata, bucket::Bucket, quantile::Quantile},
};
pub trait MetricFamilyEncoder {
fn encode(&mut self, metadata: &Metadata, metric: &dyn EncodeMetric) -> Result<()>;
}
pub trait MetricEncoder {
fn encode_unknown(&mut self, value: &dyn EncodeUnknownValue) -> Result<()>;
fn encode_gauge(&mut self, value: &dyn EncodeGaugeValue) -> Result<()>;
fn encode_counter(
&mut self,
total: &dyn EncodeCounterValue,
exemplar: Option<&dyn EncodeExemplar>,
created: Option<Duration>,
) -> Result<()>;
fn encode_stateset(&mut self, states: Vec<(&str, bool)>) -> Result<()>;
fn encode_info(&mut self, label_set: &dyn EncodeLabelSet) -> Result<()>;
fn encode_histogram(
&mut self,
buckets: &[Bucket],
exemplars: Option<&[Option<&dyn EncodeExemplar>]>,
count: u64,
sum: f64,
created: Option<Duration>,
) -> Result<()>;
fn encode_gauge_histogram(
&mut self,
buckets: &[Bucket],
exemplars: Option<&[Option<&dyn EncodeExemplar>]>,
count: u64,
sum: f64,
) -> Result<()>;
fn encode_summary(
&mut self,
quantiles: &[Quantile],
sum: f64,
count: u64,
created: Option<Duration>,
) -> Result<()>;
fn encode(&mut self, label_set: &dyn EncodeLabelSet, metric: &dyn EncodeMetric) -> Result<()>;
}
pub trait EncodeMetric: Send + Sync {
fn encode(&self, encoder: &mut dyn MetricEncoder) -> Result<()>;
fn timestamp(&self) -> Option<Duration> {
None
}
fn is_empty(&self) -> bool {
false
}
}
impl EncodeMetric for Box<dyn EncodeMetric> {
fn encode(&self, encoder: &mut dyn MetricEncoder) -> Result<()> {
(**self).encode(encoder)
}
fn timestamp(&self) -> Option<Duration> {
(**self).timestamp()
}
fn is_empty(&self) -> bool {
(**self).is_empty()
}
}