statsig_rust/user/
statsig_user.rs1use 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}