Skip to main content

made_core/value_objects/
metric_value.rs

1use super::FiniteMetricValue;
2
3/// A Prometheus sample value, including the non-finite values its text
4/// exposition permits but JSON numbers do not.
5#[derive(Clone, Copy, Debug, PartialEq)]
6pub enum MetricValue {
7    Finite(FiniteMetricValue),
8    Nan,
9    PositiveInfinity,
10    NegativeInfinity,
11}
12
13impl MetricValue {
14    #[must_use]
15    pub fn from_f64(value: f64) -> Self {
16        if value.is_nan() {
17            Self::Nan
18        } else if value == f64::INFINITY {
19            Self::PositiveInfinity
20        } else if value == f64::NEG_INFINITY {
21            Self::NegativeInfinity
22        } else {
23            Self::Finite(FiniteMetricValue::new(value))
24        }
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn classifies_finite_and_non_finite_values() {
34        let MetricValue::Finite(finite) = MetricValue::from_f64(1.25) else {
35            panic!("a finite input must remain finite");
36        };
37        assert_eq!(finite.get(), 1.25);
38        assert_eq!(MetricValue::from_f64(f64::NAN), MetricValue::Nan);
39        assert_eq!(
40            MetricValue::from_f64(f64::INFINITY),
41            MetricValue::PositiveInfinity
42        );
43        assert_eq!(
44            MetricValue::from_f64(f64::NEG_INFINITY),
45            MetricValue::NegativeInfinity
46        );
47    }
48}