Skip to main content

feature_probe_event/
event.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use std::collections::HashMap;
4
5#[derive(Serialize, Debug, Deserialize, Clone)]
6#[serde(untagged)]
7pub enum Event {
8    AccessEvent(AccessEvent),
9    CustomEvent(CustomEvent),
10    DebugEvent(DebugEvent),
11}
12
13#[derive(Serialize, Debug, Deserialize, Clone)]
14#[serde(rename_all = "camelCase")]
15pub struct AccessEvent {
16    pub kind: String,
17    pub time: u128,
18    pub key: String,
19    pub user: String,
20    pub value: Value,
21    pub variation_index: usize,
22    pub version: Option<u64>,
23    pub rule_index: Option<usize>,
24    #[serde(skip)]
25    pub track_access_events: bool,
26}
27
28#[derive(Serialize, Debug, Deserialize, Clone)]
29#[serde(rename_all = "camelCase")]
30pub struct CustomEvent {
31    pub kind: String,
32    pub time: u128,
33    pub user: String,
34    pub name: String,
35    pub value: Option<f64>,
36}
37
38#[derive(Serialize, Debug, Deserialize, Clone)]
39#[serde(rename_all = "camelCase")]
40pub struct DebugEvent {
41    pub kind: String,
42    pub time: u128,
43    pub key: String,
44    pub user: String,
45    pub user_detail: Value,
46    pub value: Value,
47    pub variation_index: usize,
48    pub version: Option<u64>,
49    pub rule_index: Option<usize>,
50    pub reason: Option<String>,
51}
52
53#[derive(Debug, PartialEq, Eq, Hash)]
54pub struct Variation {
55    pub key: String,
56    pub index: usize,
57    pub version: Option<u64>,
58}
59
60#[derive(Serialize, Debug, Deserialize)]
61pub struct CountValue {
62    pub count: u128,
63    pub value: Value,
64}
65
66#[derive(Serialize, Debug, Deserialize)]
67#[serde(rename_all = "camelCase")]
68pub struct Access {
69    pub start_time: u128,
70    pub end_time: u128,
71    pub counters: HashMap<String, Vec<ToggleCounter>>,
72}
73
74#[derive(Serialize, Debug, Deserialize)]
75pub struct ToggleCounter {
76    pub value: Value,
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub version: Option<u64>,
79    pub index: usize,
80    pub count: u128,
81}
82
83#[derive(Serialize, Debug, Deserialize)]
84pub struct PackedData {
85    #[serde(default)]
86    pub events: Vec<Event>,
87    pub access: Access,
88}
89
90#[cfg(test)]
91mod tests {
92    use super::PackedData;
93
94    #[test]
95    fn test_packed_data_without_events() {
96        let s = r#"
97        {
98            "access": {
99                "startTime": 1,
100                "endTime": 1,
101                "counters": {}
102            }
103        }
104        "#;
105
106        let p = serde_json::from_str::<PackedData>(s);
107        assert!(p.is_ok());
108        let p = p.unwrap();
109        assert!(p.events.is_empty());
110    }
111}