rovenue/events/
identity_context.rs

1// =============================================================
2// IdentityContext — per-event user identity fields
3// =============================================================
4//
5// All fields are optional; callers supply whichever identifiers
6// are available (e.g. just email, or email + externalId).
7// `skip_serializing_if = "Option::is_none"` keeps the wire
8// format compact — absent fields are omitted entirely rather
9// than serialised as `null`.
10
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, Default, Serialize, Deserialize)]
14#[serde(rename_all = "camelCase")]
15pub struct IdentityContext {
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub email: Option<String>,
18
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub external_id: Option<String>,
21
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub phone: Option<String>,
24
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub ip: Option<String>,
27
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub user_agent: Option<String>,
30
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub first_name: Option<String>,
33
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub last_name: Option<String>,
36
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub city: Option<String>,
39
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub country_code: Option<String>,
42}