sob 0.0.1

Serializable Owned/Borrow. `Cow`-like type with no `Clone` requirement, implements Serialize and Deserialize
Documentation
use serde::{Deserialize, Serialize};

use crate::Sob;

impl<'a, T> Serialize for Sob<'a, T>
where
    T: Serialize + for<'de> Deserialize<'de>,
{
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        match self {
            Sob::Owned(t) => t.serialize(serializer),
            Sob::Borrowed(t) => t.serialize(serializer),
        }
    }
}

impl<'a, 'de, T> Deserialize<'de> for Sob<'a, T>
where
    T: Serialize + for<'de_> Deserialize<'de_>,
{
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        T::deserialize(deserializer).map(Sob::Owned)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[derive(Serialize, Deserialize, PartialEq, Debug)]
    struct TestData {
        data_1: u32,
        data_2: String,
        data_3: Vec<u8>,
    }

    #[test]
    fn basic() {
        let data = TestData {
            data_1: 35498,
            data_2: "data test".to_owned(),
            data_3: vec![255, 64, 8, 0],
        };
        let sob = Sob::Borrowed(&data);
        let serialized =
            serde_json::to_string(&sob).expect("sob with test data should be serializable");
        let deserialized: Sob<'_, TestData> =
            serde_json::from_str(&serialized).expect("sob with test data should be deserializable");

        assert_eq!(deserialized, Sob::Owned(data));
    }
}