rsiot/components_config/mqtt_client/
mqtt_msg_gen.rs

1use serde::{de::DeserializeOwned, Serialize};
2
3use crate::serde_utils::{self, SerdeAlg};
4
5use super::MqttMsg;
6
7/// Генератор сообщений MQTT-брокера
8#[derive(Clone)]
9pub struct MqttMsgGen {
10    /// Алгоритм сериализации
11    pub serde_alg: SerdeAlg,
12}
13
14impl MqttMsgGen {
15    /// Сериализация сообщений перед отправкой в MQTT-сервер
16    pub fn ser<TPayload>(
17        &self,
18        topic: &str,
19        retain: bool,
20        payload: &TPayload,
21    ) -> Result<MqttMsg, serde_utils::Error>
22    where
23        TPayload: Serialize,
24    {
25        let payload = self.serde_alg.serialize(payload)?;
26        let mqtt_msg = MqttMsg {
27            topic: topic.into(),
28            retain,
29            payload,
30        };
31        Ok(mqtt_msg)
32    }
33
34    /// Десериализация сообщения от MQTT-брокера
35    pub fn de<TPayload>(&self, payload: &[u8]) -> Result<TPayload, serde_utils::Error>
36    where
37        TPayload: DeserializeOwned,
38    {
39        self.serde_alg.deserialize(payload)
40    }
41}