Skip to main content

rsiot/serde_utils/
serde_alg.rs

1use serde::{Serialize, de::DeserializeOwned};
2
3use super::{Error, SerdeAlgKind};
4
5/// Алгоритм сериализации / десериализации
6#[derive(Clone, Copy, Debug, Default, PartialEq)]
7pub struct SerdeAlg {
8    kind: SerdeAlgKind,
9}
10
11impl SerdeAlg {
12    /// Создает новый алгоритм сериализации / десериализации
13    pub fn new(kind: SerdeAlgKind) -> Self {
14        Self { kind }
15    }
16
17    /// Сериализация
18    pub fn serialize<TData>(
19        &self,
20        #[allow(unused_variables)] data: &TData,
21    ) -> Result<Vec<u8>, Error>
22    where
23        TData: Serialize,
24    {
25        #[allow(unreachable_patterns)]
26        match self.kind {
27            #[cfg(feature = "serde_cbor")]
28            SerdeAlgKind::Cbor => super::cbor::serialize(data),
29
30            #[cfg(feature = "serde_json")]
31            SerdeAlgKind::Json => super::json::serialize(data),
32
33            #[cfg(feature = "serde_messagepack")]
34            SerdeAlgKind::MessagePack => super::messagepack::serialize(data),
35
36            #[cfg(feature = "serde_toml")]
37            SerdeAlgKind::Toml => super::toml::serialize(data),
38
39            #[cfg(feature = "serde_postcard")]
40            SerdeAlgKind::Postcard => super::postcard::serialize(data),
41
42            SerdeAlgKind::Unspecified => Err(Error::UnknownAlg(self.kind)),
43        }
44    }
45
46    /// Десериализация
47    pub fn deserialize<TData>(&self, #[allow(unused_variables)] data: &[u8]) -> Result<TData, Error>
48    where
49        TData: DeserializeOwned,
50    {
51        #[allow(unreachable_patterns)]
52        match self.kind {
53            #[cfg(feature = "serde_cbor")]
54            SerdeAlgKind::Cbor => super::cbor::deserialize(data),
55
56            #[cfg(feature = "serde_json")]
57            SerdeAlgKind::Json => super::json::deserialize(data),
58
59            #[cfg(feature = "serde_messagepack")]
60            SerdeAlgKind::MessagePack => super::messagepack::deserialize(data),
61
62            #[cfg(feature = "serde_toml")]
63            SerdeAlgKind::Toml => super::toml::deserialize(data),
64
65            #[cfg(feature = "serde_postcard")]
66            SerdeAlgKind::Postcard => super::postcard::deserialize(data),
67
68            SerdeAlgKind::Unspecified => Err(Error::UnknownAlg(self.kind)),
69        }
70    }
71}