Skip to main content

rsiot/message/
message.rs

1#![allow(clippy::module_inception)]
2
3use std::fmt::Debug;
4
5use serde::{Deserialize, Serialize};
6use uuid::Uuid;
7
8use super::{MsgData, MsgDataBound, Timestamp};
9
10// ANCHOR: Message
11/// Сообщение
12#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
13pub struct Message<TMsg> {
14    /// Данные
15    pub data: MsgData<TMsg>,
16    /// Ключ
17    pub key: String,
18    /// Метка времени
19    pub ts: Timestamp,
20
21    cmp_source: Uuid,
22}
23// ANCHOR: Message
24
25impl<TMsg> Message<TMsg>
26where
27    TMsg: MsgDataBound,
28{
29    /// Создать новое сообщение
30    pub fn new(data: MsgData<TMsg>) -> Self {
31        let key = data.key();
32        Self {
33            data,
34            key,
35            ts: Default::default(),
36            cmp_source: Uuid::default(),
37        }
38    }
39
40    /// Создать новое сообщение типа `MsgData::Custom`
41    pub fn new_custom(custom_data: TMsg) -> Self {
42        let data = MsgData::Custom(custom_data);
43        let key = data.key();
44        Self {
45            data,
46            key,
47            ts: Default::default(),
48            cmp_source: Uuid::default(),
49        }
50    }
51
52    /// Возвращает данные сообщения, если тип сообщения `MsgData::Custom`
53    pub fn get_custom_data(&self) -> Option<TMsg> {
54        match &self.data {
55            MsgData::System(_) => None,
56            MsgData::Custom(data) => Some(data.clone()),
57        }
58    }
59
60    /// Задать идентификатор компонента, который отправил сообщение
61    pub fn set_cmp_source(&mut self, id: &Uuid) {
62        self.cmp_source = *id;
63    }
64
65    /// Проверить, что сообщение было отправлено из указанного источника
66    pub fn check_source(&self, id: &Uuid) -> bool {
67        &self.cmp_source == id
68    }
69}