rumtk_core/serde/
json_impl.rs1use crate::buffers::buffer_to_str;
21use crate::buffers::*;
22use crate::mem::AsSlice;
23pub use crate::serde::json::*;
24use crate::strings::string_to_buffer;
25pub use crate::types::RUMOrderedMap;
26use std::hash::Hash;
27use std::mem::ManuallyDrop;
28
29impl RUMSerJson for RUMBuffer {
30 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
31 where
32 S: RUMJsonSerializer,
33 {
34 let string = match buffer_to_str(&self.as_slice()) {
36 Ok(string) => string,
37 Err(err) => return Err(serde::ser::Error::custom(err)),
38 };
39 serializer.serialize_str(string)
40 }
41}
42
43impl<'a> RUMDeJson<'a> for RUMBuffer {
44 fn deserialize<D>(deserializer: D) -> Result<Self, <D>::Error>
45 where
46 D: RUMJsonDeserializer<'a>,
47 {
48 let escaped_val = String::deserialize(deserializer)?;
49 if escaped_val.len() > 0 {
50 Ok(string_to_buffer(&escaped_val))
51 } else {
52 Ok(RUMBuffer::default())
53 }
54 }
55}
56
57#[derive(Default, Debug, PartialEq, Clone)]
58pub struct RUMSerializableManualDrop<T>(pub ManuallyDrop<T>);
59
60impl<T> RUMSerializableManualDrop<T> {
61 pub fn new(v: T) -> Self {
62 RUMSerializableManualDrop(ManuallyDrop::new(v))
63 }
64
65 pub fn inner(&self) -> &T {
66 &self.0
67 }
68}
69
70impl<T> RUMSerJson for RUMSerializableManualDrop<T>
71where
72 T: RUMSerJson + Clone,
73{
74 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
75 where
76 S: RUMJsonSerializer,
77 {
78 self.inner().serialize(serializer)
79 }
80}
81
82impl<'a, T: RUMDeJson<'a>> RUMDeJson<'a> for RUMSerializableManualDrop<T> {
83 fn deserialize<D>(deserializer: D) -> Result<Self, <D>::Error>
84 where
85 D: RUMJsonDeserializer<'a>,
86 {
87 let escaped_val = T::deserialize(deserializer)?;
88 Ok(RUMSerializableManualDrop(ManuallyDrop::new(escaped_val)))
89 }
90}