scsys_agents/components/messages/
message.rs

1/*
2    Appellation: message <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4    Description: ... summary ...
5*/
6use 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}