statsig_rust/
init_details.rs1use serde::Serialize;
2
3use crate::{networking::NetworkError, SpecsInfo, SpecsSource, StatsigErr};
4
5#[derive(Debug, Clone, Serialize)]
6pub struct FailureDetails {
7 pub reason: String,
8 pub error: Option<StatsigErr>,
9}
10
11#[derive(Debug, Clone, Serialize)]
12pub struct InitializeDetails {
13 pub duration_ms: u64,
14 pub init_success: bool,
15 pub is_config_spec_ready: bool,
16 pub is_id_list_ready: Option<bool>,
17 pub source: SpecsSource,
18 pub failure_details: Option<FailureDetails>,
19 pub spec_source_api: Option<String>,
20
21 #[deprecated(since = "0.11.0", note = "Use the duration_ms field instead")]
22 pub duration: f64,
23}
24
25impl Default for InitializeDetails {
26 fn default() -> Self {
27 InitializeDetails {
28 duration_ms: 0,
29 init_success: false,
30 is_config_spec_ready: false,
31 is_id_list_ready: None,
32 source: SpecsSource::Uninitialized,
33 failure_details: None,
34 spec_source_api: None,
35
36 #[allow(deprecated)]
37 duration: 0.0,
38 }
39 }
40}
41
42impl InitializeDetails {
43 pub fn new(
44 init_success: bool,
45 duration_ms: u64,
46 specs_info: SpecsInfo,
47 is_id_list_ready: Option<bool>,
48 error: Option<StatsigErr>,
49 ) -> InitializeDetails {
50 let is_config_spec_ready = matches!(specs_info.lcut, Some(v) if v != 0);
51
52 let failure_details =
53 if let Some(StatsigErr::NetworkError(NetworkError::DisableNetworkOn(_))) = error {
54 None
55 } else {
56 error.as_ref().map(|e| FailureDetails {
57 reason: e.to_string(),
58 error: Some(e.clone()),
59 })
60 };
61
62 InitializeDetails {
63 init_success,
64 is_config_spec_ready,
65 is_id_list_ready,
66 source: specs_info.source.clone(),
67 failure_details,
68 duration_ms,
69 spec_source_api: specs_info.source_api.clone(),
70
71 #[allow(deprecated)]
72 duration: duration_ms as f64,
73 }
74 }
75
76 pub fn from_error(reason: &str, error: Option<StatsigErr>) -> Self {
77 InitializeDetails {
78 duration_ms: 0,
79 init_success: false,
80 is_config_spec_ready: false,
81 is_id_list_ready: None,
82 source: SpecsSource::Uninitialized,
83 failure_details: Some(FailureDetails {
84 reason: reason.to_string(),
85 error,
86 }),
87 spec_source_api: None,
88
89 #[allow(deprecated)]
90 duration: 0.0,
91 }
92 }
93
94 pub fn from_timeout_failure(timeout_ms: u64) -> InitializeDetails {
95 InitializeDetails {
96 init_success: false,
97 is_config_spec_ready: false,
98 is_id_list_ready: None,
99 source: SpecsSource::Uninitialized,
100 failure_details: Some(FailureDetails {
101 reason: "Initialization timed out".to_string(),
102 error: None,
103 }),
104 duration_ms: timeout_ms,
105 spec_source_api: None,
106
107 #[allow(deprecated)]
108 duration: timeout_ms as f64,
109 }
110 }
111}