diff options
author | Albin Suresh <albin.suresh@softwareag.com> | 2022-03-07 17:42:04 +0530 |
---|---|---|
committer | Albin Suresh <albin.suresh@softwareag.com> | 2022-03-11 12:40:45 +0530 |
commit | 59fd1aa5ec16cc6a8cd89fc8f3541cf33f763ff3 (patch) | |
tree | 128406c2a056d723574d8496cc1f033efb9484c8 /crates/core/thin_edge_json | |
parent | c02fd97270b026536ed4d3e12f793299e9e76b70 (diff) |
Closes #893 Support custom fields and fragments in Thin Edge JSON events
Diffstat (limited to 'crates/core/thin_edge_json')
-rw-r--r-- | crates/core/thin_edge_json/src/event.rs | 62 |
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(()) } |