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