scsys_agents/components/messages/
message.rs1use chrono::Utc;
7use serde::{Deserialize, Serialize};
8use serde_json::Value;
9use std::fmt;
10
11#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, PartialEq, Serialize)]
12pub struct Message<T: fmt::Display = Value> {
13 pub data: Vec<T>,
14 pub timestamp: i64,
15}
16
17impl<T: fmt::Display> Message<T> {
18 pub fn new(data: Vec<T>) -> Self {
19 let timestamp = Utc::now().timestamp();
20 Self { data, timestamp }
21 }
22 pub fn content(&self) -> &Vec<T> {
23 &self.data
24 }
25 pub fn push(&mut self, data: T) -> &Self {
26 self.data.push(data);
27 self
28 }
29}
30
31impl<T: fmt::Display> std::convert::From<Vec<T>> for Message<T> {
32 fn from(data: Vec<T>) -> Self {
33 Self::new(data)
34 }
35}
36
37impl<T: fmt::Display> std::convert::From<T> for Message<T> {
38 fn from(data: T) -> Self {
39 Self::new(vec![data])
40 }
41}
42
43impl<T: Serialize + fmt::Display> std::fmt::Display for Message<T> {
44 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
45 write!(
46 f,
47 "{}",
48 serde_json::to_string_pretty(&self).unwrap().to_lowercase()
49 )
50 }
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56
57 #[test]
58 fn test_default_message() {
59 let a = Message::<String>::default();
60 assert_eq!(&a.data, &a.data)
61 }
62}