wolf_graph/details/
data.rs

1use base64::prelude::*;
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5/// A wrapper for binary data that is serialized as Base64.
6///
7/// This type is useful when you want to serialize binary data in a graph to
8/// JSON. It is also the serialization behavior of the `Data` type in Swift.
9#[derive(Clone, Debug, PartialEq, Default)]
10pub struct Data(pub Vec<u8>);
11
12impl Data {
13    pub fn new(data: impl Into<Vec<u8>>) -> Self {
14        Data(data.into())
15    }
16}
17
18impl<T: AsRef<[u8]>> From<T> for Data {
19    fn from(data: T) -> Self {
20        Data(data.as_ref().to_vec())
21    }
22}
23
24#[cfg(feature = "serde")]
25impl Serialize for Data {
26    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
27    where
28        S: serde::ser::Serializer,
29    {
30        let encoded = BASE64_STANDARD.encode(&self.0);
31        serializer.serialize_str(&encoded)
32    }
33}
34
35#[cfg(feature = "serde")]
36impl<'de> Deserialize<'de> for Data {
37    fn deserialize<D>(deserializer: D) -> Result<Data, D::Error>
38    where
39        D: serde::de::Deserializer<'de>,
40    {
41        let encoded = String::deserialize(deserializer)?;
42        let decoded = BASE64_STANDARD.decode(encoded).map_err(serde::de::Error::custom)?;
43        Ok(Data(decoded))
44    }
45}