myko_rs/
event.rs

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}