statsig_rust/evaluation/
evaluation_details.rs1use 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}