bos 0.3.1

Flexible Borrowed, Owned or Shared (B.O.S.) smart pointers. Like std's Cow but with Rc/Arc and without the ToOwned requirement.
Documentation
use std::borrow::Borrow;

use crate::{Abos, Bos};
use serde::{Deserialize, Deserializer, Serialize, Serializer};

impl<'de, 'b, B: ?Sized, O, S: ?Sized> Deserialize<'de> for Abos<'b, B, O, S>
where
    O: Deserialize<'de>,
{
    #[inline]
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        O::deserialize(deserializer).map(Self::Owned)
    }
}

impl<'de, 'b, B: ?Sized, O, S: ?Sized> Deserialize<'de> for Bos<'b, B, O, S>
where
    O: Deserialize<'de>,
{
    #[inline]
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        O::deserialize(deserializer).map(Self::Owned)
    }
}

impl<'b, B: ?Sized, O, S: ?Sized> Serialize for Abos<'b, B, O, S>
where
    B: Serialize,
    O: Serialize + Borrow<B>,
    S: Serialize + Borrow<B>,
{
    fn serialize<Ser>(&self, serializer: Ser) -> Result<Ser::Ok, Ser::Error>
    where
        Ser: Serializer,
    {
        let b: &B = self.borrow();
        b.serialize(serializer)
    }
}

impl<'b, B: ?Sized, O, S: ?Sized> Serialize for Bos<'b, B, O, S>
where
    B: Serialize,
    O: Serialize + Borrow<B>,
    S: Serialize + Borrow<B>,
{
    fn serialize<Ser>(&self, serializer: Ser) -> Result<Ser::Ok, Ser::Error>
    where
        Ser: Serializer,
    {
        let b: &B = self.borrow();
        b.serialize(serializer)
    }
}