rsiot/message/
msg_serde.rs

1use serde::{de::DeserializeOwned, Serialize};
2
3use super::{message::Message, MsgData};
4
5use serde_json::{from_str as deserialize, to_string as serialize, to_string_pretty};
6
7impl<TData> Message<TData>
8where
9    TData: DeserializeOwned + Serialize,
10{
11    /// Сериализация сообщений в json
12    pub fn serialize(&self) -> Result<String, super::Error> {
13        let json = serialize::<Self>(self);
14        match json {
15            Ok(value) => Ok(value),
16            Err(error) => {
17                let error = error.to_string();
18                Err(super::Error::Serialization(error))
19            }
20        }
21    }
22
23    /// Сериализация сообщений в json
24    pub fn serialize_json_pretty(&self) -> Result<String, super::Error> {
25        let json = to_string_pretty::<Self>(self);
26        match json {
27            Ok(value) => Ok(value),
28            Err(error) => {
29                let error = error.to_string();
30                Err(super::Error::Serialization(error))
31            }
32        }
33    }
34
35    /// Сериализация полей данных сообщений в json
36    pub fn serialize_data(&self) -> Result<String, super::Error> {
37        let json = serialize::<MsgData<TData>>(&self.data);
38        match json {
39            Ok(value) => Ok(value),
40            Err(error) => {
41                let error = error.to_string();
42                Err(super::Error::Serialization(error))
43            }
44        }
45    }
46
47    /// Десериализация одного сообщения из json
48    pub fn deserialize(text: &str) -> Result<Self, super::Error> {
49        match deserialize::<Self>(text) {
50            Ok(value) => Ok(value),
51            Err(error) => {
52                let error = error.to_string();
53                let data = text.to_string();
54                Err(super::Error::Deserialization { error, data })
55            }
56        }
57    }
58
59    /// Десериализация массива сообщений из json
60    pub fn deserialize_many(text: &str) -> Result<Vec<Self>, super::Error> {
61        match deserialize::<Vec<Self>>(text) {
62            Ok(value) => Ok(value),
63            Err(error) => {
64                let error = error.to_string();
65                let data = text.to_string();
66                Err(super::Error::Deserialization { error, data })
67            }
68        }
69    }
70}