devcycle_bucketing_rs/events/
event.rs

1use crate::user::{PopulatedUser, User};
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4use std::fmt;
5
6#[derive(Debug, Clone, PartialEq, Eq, Hash)]
7pub enum EventType {
8    AggregateVariableEvaluated,
9    AggregateVariableDefaulted,
10    VariableEvaluated,
11    VariableDefaulted,
12    SDKConfig,
13    CustomEvent,
14}
15
16#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
17pub enum EvaluationReason {
18    #[serde(rename = "TARGETING_MATCH")]
19    TargetingMatch,
20    #[serde(rename = "SPLIT")]
21    Split,
22    #[serde(rename = "DEFAULT")]
23    Default,
24    #[serde(rename = "DISABLED")]
25    Disabled,
26    #[serde(rename = "ERROR")]
27    Error,
28}
29
30impl fmt::Display for EvaluationReason {
31    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32        let s = match self {
33            EvaluationReason::TargetingMatch => "TARGETING_MATCH",
34            EvaluationReason::Split => "SPLIT",
35            EvaluationReason::Default => "DEFAULT",
36            EvaluationReason::Disabled => "DISABLED",
37            EvaluationReason::Error => "ERROR",
38        };
39        write!(f, "{}", s)
40    }
41}
42
43#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
44pub enum DefaultReason {
45    #[serde(rename = "Missing Config")]
46    MissingConfig,
47    #[serde(rename = "Missing Variable")]
48    MissingVariable,
49    #[serde(rename = "Missing Feature")]
50    MissingFeature,
51    #[serde(rename = "Missing Variation")]
52    MissingVariation,
53    #[serde(rename = "Missing Variable for Variation")]
54    MissingVariableForVariation,
55    #[serde(rename = "User Not in Rollout")]
56    UserNotInRollout,
57    #[serde(rename = "User Not Targeted")]
58    UserNotTargeted,
59    #[serde(rename = "Invalid Variable Type")]
60    InvalidVariableType,
61    #[serde(rename = "Variable Type Mismatch")]
62    VariableTypeMismatch,
63    #[serde(rename = "Unknown")]
64    Unknown,
65    #[serde(rename = "Error")]
66    Error,
67    #[serde(rename = "")]
68    NotDefaulted,
69}
70
71impl fmt::Display for DefaultReason {
72    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
73        let s = match self {
74            DefaultReason::MissingConfig => "Missing Config",
75            DefaultReason::MissingVariable => "Missing Variable",
76            DefaultReason::MissingFeature => "Missing Feature",
77            DefaultReason::MissingVariation => "Missing Variation",
78            DefaultReason::MissingVariableForVariation => "Missing Variable for Variation",
79            DefaultReason::UserNotInRollout => "User Not in Rollout",
80            DefaultReason::UserNotTargeted => "User Not Targeted",
81            DefaultReason::InvalidVariableType => "Invalid Variable Type",
82            DefaultReason::VariableTypeMismatch => "Variable Type Mismatch",
83            DefaultReason::Unknown => "Unknown",
84            DefaultReason::Error => "Error",
85            DefaultReason::NotDefaulted => "",
86        };
87        write!(f, "{}", s)
88    }
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize)]
92pub struct EvalDetails {
93    pub reason: EvaluationReason,
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub details: Option<String>,
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub target_id: Option<String>,
98}
99
100pub(crate) type EvalReasonAggMap = HashMap<EvaluationReason, i64>;
101pub(crate) type VariationAggMap = HashMap<String, EvalReasonAggMap>;
102pub(crate) type FeatureAggMap = HashMap<String, VariationAggMap>;
103pub(crate) type VariableAggMap = HashMap<String, FeatureAggMap>;
104pub(crate) type AggregateEventQueue = HashMap<EventType, VariableAggMap>;
105pub(crate) type UserEventQueue = HashMap<String, UserEventsBatchRecord>;
106
107pub(crate) struct Event {
108    pub(crate) event_type: EventType,
109    pub(crate) target: String,
110    pub(crate) custom_type: String,
111    pub(crate) user_id: String,
112    pub(crate) client_date: std::time::Instant,
113    pub(crate) value: f64,
114    pub(crate) feature_vars: HashMap<String, String>,
115    pub(crate) meta_data: HashMap<String, serde_json::Value>,
116}
117
118pub(crate) struct UserEventData {
119    pub(crate) event: Event,
120    pub(crate) user: User,
121}
122
123pub(crate) struct UserEventsBatchRecord {
124    pub(crate) user: PopulatedUser,
125    pub(crate) events: Vec<Event>,
126}
127
128pub(crate) struct AggEventQueueRawMessage {
129    pub(crate) event_type: EventType,
130    pub(crate) variable_key: String,
131    pub(crate) feature_id: String,
132    pub(crate) variation_id: String,
133    pub(crate) eval_metadata: EvalReasonAggMap,
134}