statsig_rust/user/
statsig_user.rs

1use crate::dyn_value;
2use crate::evaluation::dynamic_value::DynamicValue;
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Clone, Deserialize, Serialize)]
7#[serde(rename_all = "camelCase")]
8pub struct StatsigUser {
9    #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
10    pub user_id: Option<DynamicValue>,
11
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub email: Option<DynamicValue>,
14
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub ip: Option<DynamicValue>,
17
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub user_agent: Option<DynamicValue>,
20
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub country: Option<DynamicValue>,
23
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub locale: Option<DynamicValue>,
26
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub app_version: Option<DynamicValue>,
29
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub custom: Option<HashMap<String, DynamicValue>>,
32
33    #[serde(skip_serializing)]
34    pub private_attributes: Option<HashMap<String, DynamicValue>>,
35
36    #[serde(rename = "customIDs", skip_serializing_if = "Option::is_none")]
37    pub custom_ids: Option<HashMap<String, DynamicValue>>,
38}
39
40impl StatsigUser {
41    #[must_use]
42    pub fn with_user_id(user_id: String) -> Self {
43        StatsigUser {
44            user_id: Some(dyn_value!(user_id)),
45            ..Self::default()
46        }
47    }
48
49    #[must_use]
50    pub fn with_custom_ids<V>(custom_ids: HashMap<String, V>) -> Self
51    where
52        V: Into<DynamicValue>,
53    {
54        StatsigUser {
55            custom_ids: Some(custom_ids.into_iter().map(|(k, v)| (k, v.into())).collect()),
56            ..Self::default()
57        }
58    }
59
60    fn default() -> Self {
61        StatsigUser {
62            user_id: None,
63            email: None,
64            ip: None,
65            user_agent: None,
66            country: None,
67            locale: None,
68            app_version: None,
69            custom: None,
70            private_attributes: None,
71            custom_ids: None,
72        }
73    }
74}