serialization/
deserialize.rs1use crate::Deserialize;
3use crate::error::SerializationError;
4use crate::format::SerializationFormat;
5use anyhow::Error;
6
7type Result<T> = std::result::Result<T, SerializationError>;
9
10#[inline]
40pub fn deserialize<'a, T>(subject: &'a [u8], format: &SerializationFormat) -> Result<T>
41where
42 T: Deserialize<'a>,
43{
44 match format {
45 SerializationFormat::JSON => deserialize_json(subject),
46 SerializationFormat::MessagePack => deserialize_messagepack(subject),
47 SerializationFormat::Toml => deserialize_toml(subject),
48 }
49}
50
51#[allow(clippy::missing_errors_doc)]
53pub fn deserialize_json<'a, T: Deserialize<'a>>(subject: &'a [u8]) -> Result<T> {
54 serde_json::from_slice(subject)
55 .map_err(|error| SerializationError::Deserialize(Error::from(error)))
56}
57
58#[allow(clippy::missing_errors_doc)]
60#[cfg_attr(not(feature = "msgpack"), allow(unused_variables))]
61pub fn deserialize_messagepack<'a, T: Deserialize<'a>>(subject: &'a [u8]) -> Result<T> {
62 #[cfg(not(feature = "msgpack"))]
63 return Err(SerializationError::FormatUnavailable("msgpack"));
64
65 #[cfg(feature = "msgpack")]
66 rmp_serde::from_slice(subject)
67 .map_err(|error| SerializationError::Deserialize(Error::from(error)))
68}
69
70#[allow(clippy::missing_errors_doc)]
72#[cfg_attr(not(feature = "toml"), allow(unused_variables))]
73pub fn deserialize_toml<'a, T>(subject: &'a [u8]) -> Result<T>
74where
75 T: Deserialize<'a>,
76{
77 #[cfg(not(feature = "toml"))]
78 return Err(SerializationError::FormatUnavailable("toml"));
79
80 #[cfg(feature = "toml")]
81 {
82 let str = String::from_utf8_lossy(subject);
83 let deserializer = toml::Deserializer::new(&str);
84
85 T::deserialize(deserializer)
86 .map_err(|error| SerializationError::Deserialize(Error::from(error)))
87 }
88}