devcycle_bucketing_rs/events/
event.rs1use 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}