use crate::{
encoder::{EncodeMetric, EncodeUnknownValue, MetricEncoder},
error::Result,
raw::{MetricLabelSet, MetricType, Number, TypedMetric},
};
pub trait UnknownValue: Number {}
impl UnknownValue for i32 {}
impl UnknownValue for i64 {}
impl UnknownValue for isize {}
impl UnknownValue for u32 {}
impl UnknownValue for f32 {}
impl UnknownValue for f64 {}
#[derive(Clone, Debug)]
pub struct Unknown<T> {
value: T,
}
impl<T: UnknownValue> Unknown<T> {
pub const fn new(value: T) -> Self {
Self { value }
}
pub fn get(&self) -> &T {
&self.value
}
}
impl<T: UnknownValue> TypedMetric for Unknown<T> {
const TYPE: MetricType = MetricType::Unknown;
}
impl<T: UnknownValue> MetricLabelSet for Unknown<T> {
type LabelSet = ();
}
impl<T: EncodeUnknownValue + UnknownValue> EncodeMetric for Unknown<T> {
fn encode(&self, encoder: &mut dyn MetricEncoder) -> Result<()> {
encoder.encode_unknown(self.get())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::metrics::check_text_encoding;
#[test]
fn test_text_encoding() {
check_text_encoding(
|registry| {
let unknown = Unknown::new(1);
registry.register("my_unknown", "My unknown help", unknown.clone()).unwrap();
},
|output| {
let expected = indoc::indoc! {r#"
# TYPE my_unknown unknown
# HELP my_unknown My unknown help
my_unknown 1
# EOF
"#};
assert_eq!(output, expected);
},
);
}
}