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