statsig_rust/evaluation/
evaluation_details.rs

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