wolf-graph 0.1.0

Data structures and algorithms for working with graphs with reference or value semantics.
Documentation
use base64::prelude::*;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};

/// A wrapper for binary data that is serialized as Base64.
///
/// This type is useful when you want to serialize binary data in a graph to
/// JSON. It is also the serialization behavior of the `Data` type in Swift.
#[derive(Clone, Debug, PartialEq, Default)]
pub struct Data(pub Vec<u8>);

impl Data {
    pub fn new(data: impl Into<Vec<u8>>) -> Self {
        Data(data.into())
    }
}

impl<T: AsRef<[u8]>> From<T> for Data {
    fn from(data: T) -> Self {
        Data(data.as_ref().to_vec())
    }
}

#[cfg(feature = "serde")]
impl Serialize for Data {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::ser::Serializer,
    {
        let encoded = BASE64_STANDARD.encode(&self.0);
        serializer.serialize_str(&encoded)
    }
}

#[cfg(feature = "serde")]
impl<'de> Deserialize<'de> for Data {
    fn deserialize<D>(deserializer: D) -> Result<Data, D::Error>
    where
        D: serde::de::Deserializer<'de>,
    {
        let encoded = String::deserialize(deserializer)?;
        let decoded = BASE64_STANDARD.decode(encoded).map_err(serde::de::Error::custom)?;
        Ok(Data(decoded))
    }
}