statsig_rust/evaluation/
evaluation_details.rs

1use crate::evaluation::evaluator_result::EvaluatorResult;
2use crate::SpecsSource;
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)]
6pub struct EvaluationDetails {
7    pub reason: String,
8    pub lcut: Option<u64>,
9    pub received_at: Option<u64>,
10}
11
12impl EvaluationDetails {
13    pub fn unrecognized(source: &SpecsSource, lcut: u64, received_at: Option<u64>) -> Self {
14        Self::create_from_data(
15            source,
16            lcut,
17            received_at,
18            "Unrecognized",
19            &EvaluatorResult::default(),
20        )
21    }
22
23    pub fn recognized_without_eval_result(
24        source: &SpecsSource,
25        lcut: u64,
26        received_at: Option<u64>,
27    ) -> Self {
28        Self::create_from_data(
29            source,
30            lcut,
31            received_at,
32            "Recognized",
33            &EvaluatorResult::default(),
34        )
35    }
36
37    pub fn recognized(
38        source: &SpecsSource,
39        lcut: u64,
40        received_at: Option<u64>,
41        eval_result: &EvaluatorResult,
42    ) -> Self {
43        Self::create_from_data(source, lcut, received_at, "Recognized", eval_result)
44    }
45
46    pub fn recognized_but_overridden(
47        lcut: u64,
48        received_at: Option<u64>,
49        override_reason: &str,
50    ) -> Self {
51        Self {
52            reason: format!("{override_reason}:Recognized"),
53            lcut: Some(lcut),
54            received_at,
55        }
56    }
57
58    #[must_use]
59    pub fn unrecognized_no_data() -> Self {
60        Self {
61            reason: SpecsSource::NoValues.to_string(),
62            lcut: None,
63            received_at: None,
64        }
65    }
66
67    #[must_use]
68    pub fn error(sub_reason: &str) -> Self {
69        Self {
70            reason: format!("Error:{sub_reason}"),
71            lcut: None,
72            received_at: None,
73        }
74    }
75
76    fn create_from_data(
77        source: &SpecsSource,
78        lcut: u64,
79        received_at: Option<u64>,
80        sub_reason: &str,
81        eval_result: &EvaluatorResult,
82    ) -> Self {
83        if *source == SpecsSource::Uninitialized || *source == SpecsSource::NoValues {
84            return Self {
85                reason: source.to_string(),
86                lcut: None,
87                received_at: None,
88            };
89        }
90
91        if eval_result.unsupported {
92            return Self {
93                reason: format!("{source}:Unsupported"),
94                lcut: Some(lcut),
95                received_at,
96            };
97        }
98
99        Self {
100            reason: format!("{source}:{sub_reason}"),
101            lcut: Some(lcut),
102            received_at,
103        }
104    }
105}