summaryrefslogtreecommitdiffstats
path: root/crates/core/thin_edge_json/src/event.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/core/thin_edge_json/src/event.rs')
-rw-r--r--crates/core/thin_edge_json/src/event.rs62
1 files changed, 59 insertions, 3 deletions
diff --git a/crates/core/thin_edge_json/src/event.rs b/crates/core/thin_edge_json/src/event.rs
index 474128ed..42b1ed35 100644
--- a/crates/core/thin_edge_json/src/event.rs
+++ b/crates/core/thin_edge_json/src/event.rs
@@ -1,23 +1,31 @@
+use std::collections::HashMap;
+
use clock::Timestamp;
-use serde::Deserialize;
+use serde::{Deserialize, Serialize};
+use serde_json::Value;
use self::error::ThinEdgeJsonDeserializerError;
/// In-memory representation of ThinEdge JSON event.
-#[derive(Debug, Deserialize, PartialEq)]
+#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct ThinEdgeEvent {
+ #[serde(rename = "type")]
pub name: String,
+ #[serde(flatten)]
pub data: Option<ThinEdgeEventData>,
}
/// In-memory representation of ThinEdge JSON event payload
-#[derive(Debug, Deserialize, PartialEq)]
+#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct ThinEdgeEventData {
pub text: Option<String>,
#[serde(default)]
#[serde(with = "clock::serde::rfc3339::option")]
pub time: Option<Timestamp>,
+
+ #[serde(flatten)]
+ pub extras: HashMap<String, Value>,
}
pub mod error {
@@ -84,6 +92,7 @@ mod tests {
data: Some(ThinEdgeEventData {
text: Some("Someone clicked".into()),
time: Some(datetime!(2021-04-23 19:00:00 +05:00)),
+ extras: HashMap::new(),
}),
};
"event parsing"
@@ -98,6 +107,7 @@ mod tests {
data: Some(ThinEdgeEventData {
text: Some("Someone clicked".into()),
time: None,
+ extras: HashMap::new(),
}),
};
"event parsing without timestamp"
@@ -112,6 +122,7 @@ mod tests {
data: Some(ThinEdgeEventData {
text: None,
time: Some(datetime!(2021-04-23 19:00:00 +05:00)),
+ extras: HashMap::new(),
}),
};
"event parsing without text"
@@ -124,6 +135,7 @@ mod tests {
data: Some(ThinEdgeEventData {
text: None,
time: None,
+ extras: HashMap::new(),
}),
};
"event parsing without text or timestamp"
@@ -158,9 +170,53 @@ mod tests {
#[test]
fn event_translation_empty_payload() -> Result<()> {
+ let event_data = ThinEdgeEventData {
+ text: Some("foo".to_string()),
+ time: Some(datetime!(2021-04-23 19:00:00 +05:00)),
+ extras: HashMap::new(),
+ };
+
+ let serialized = serde_json::to_string(&event_data).unwrap();
+ println!("serialized = {}", serialized);
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_serialize() -> Result<()> {
let result = ThinEdgeEvent::try_from("tedge/events/click_event", "")?;
assert_eq!(result.name, "click_event".to_string());
assert_matches!(result.data, None);
+ Ok(())
+ }
+
+ #[test]
+ fn event_translation_additional_fields() -> Result<()> {
+ let event_json = json!({
+ "text": "foo",
+ "time": "2021-04-23T19:00:00+05:00",
+ "extra": "field",
+ "numeric": 32u64,
+ "complex": {
+ "hello": "world",
+ "num": 5u32
+ }
+ });
+
+ let result =
+ ThinEdgeEvent::try_from("tedge/events/click_event", event_json.to_string().as_str())?;
+
+ assert_eq!(result.name, "click_event".to_string());
+ let event_data = result.data.unwrap();
+ assert_eq!(
+ event_data.extras.get("extra").unwrap().as_str().unwrap(),
+ "field"
+ );
+ assert_eq!(
+ event_data.extras.get("numeric").unwrap().as_u64().unwrap(),
+ 32u64
+ );
+ assert_matches!(event_data.extras.get("complex"), Some(Value::Object(_)));
Ok(())
}