made_core/value_objects/
metric_value.rs1use super::FiniteMetricValue;
2
3#[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}