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