1use std::io::Cursor;
2
3use crate::{item::Eventable, utils::remove_whitespace};
4use chrono::Utc;
5use rmp_serde::Deserializer;
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
10pub enum MEventType {
11 SET,
12 DEL,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct MEvent {
17 item: Value,
18
19 #[serde(rename = "changeType")]
20 change_type: MEventType,
21
22 #[serde(rename = "itemType")]
23 item_type: String,
24
25 #[serde(rename = "createdAt")]
26 created_at: String,
27
28 tx: String,
29
30 #[serde(rename = "sourceId")]
31 source_id: Option<String>,
32}
33
34impl MEvent {
35 pub fn from_str_trim(s: &str) -> Result<MEvent, serde_json::Error> {
36 serde_json::from_str(&remove_whitespace(s))
37 }
38
39 pub fn from_mp(s: &[u8]) -> Result<MEvent, rmp_serde::decode::Error> {
40 let cur = Cursor::new(s);
41 let mut de = Deserializer::new(cur);
42 Deserialize::deserialize(&mut de)
43 }
44
45 pub fn item_json(&self) -> Value {
46 self.item.clone()
47 }
48
49 pub fn from_item<T, PT: Clone>(
50 item: &impl Eventable<T, PT>,
51 change_type: MEventType,
52 tx: String,
53 ) -> MEvent {
54 MEvent {
55 item: serde_json::to_value(item).unwrap(),
56 change_type,
57 item_type: item.entity_name().to_string(),
58 created_at: Utc::now().format("%Y-%m-%dT%H:%M:%S%.3fZ").to_string(),
59 tx,
60 source_id: None,
61 }
62 }
63
64 pub fn change_type(&self) -> MEventType {
65 self.change_type
66 }
67
68 pub fn item_type(&self) -> String {
69 self.item_type.to_string()
70 }
71}