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}
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}