use crate::{
core::{Deserializer, PubNubError},
lib::alloc::string::ToString,
};
#[derive(Debug, Clone)]
pub struct DeserializerSerde;
impl Deserializer for DeserializerSerde {
fn deserialize<T>(&self, bytes: &[u8]) -> Result<T, PubNubError>
where
T: for<'de> serde::Deserialize<'de>,
{
serde_json::from_slice(bytes).map_err(|e| PubNubError::Deserialization {
details: e.to_string(),
})
}
}
impl<'de, D> crate::core::Deserialize<'de> for D
where
D: serde::Deserialize<'de> + Send + Sync,
{
type Type = D;
fn deserialize(bytes: &'de [u8]) -> Result<Self::Type, PubNubError> {
serde_json::from_slice(bytes).map_err(|e| PubNubError::Deserialization {
details: e.to_string(),
})
}
}
#[cfg(test)]
mod should {
use super::*;
use crate::lib::alloc::string::String;
use serde::Deserialize;
#[derive(Deserialize, Debug, PartialEq)]
struct Foo {
bar: String,
}
#[test]
fn deserialize() {
let sut = DeserializerSerde;
let result: Foo = sut.deserialize(&Vec::from("{\"bar\":\"baz\"}")).unwrap();
assert_eq!(
result,
Foo {
bar: "baz".to_string()
}
);
}
}