statsig_rust/
init_details.rs

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