flex 0.2.0

Flexible borrowing and ownership for Rust
Documentation
use core::borrow::Borrow;

use super::Flex;

#[cfg(feature = "alloc")]
use alloc::{
    borrow::{Cow, ToOwned},
    boxed::Box,
};

impl<'a, T: ?Sized> Borrow<T> for Flex<'a, T> {
    fn borrow(&self) -> &T {
        self
    }
}

impl<'a, T: ?Sized + AsRef<U>, U: ?Sized> AsRef<U> for Flex<'a, T> {
    fn as_ref(&self) -> &U {
        match self {
            Flex::Lend(r) => r.as_ref(),

            #[cfg(feature = "alloc")]
            Flex::Give(b) => (**b).as_ref(),
        }
    }
}

impl<'a, T: ?Sized> From<&'a T> for Flex<'a, T> {
    fn from(r: &'a T) -> Self {
        Flex::Lend(r)
    }
}

impl<'a, T: ?Sized> From<&'a mut T> for Flex<'a, T> {
    fn from(r: &'a mut T) -> Self {
        Flex::Lend(r)
    }
}

#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
impl<T: ?Sized> From<Box<T>> for Flex<'_, T> {
    fn from(b: Box<T>) -> Self {
        Flex::Give(b)
    }
}

#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
impl<'a, T: ?Sized + ToOwned> From<Cow<'a, T>> for Flex<'a, T>
where
    T::Owned: Into<Box<T>>,
{
    fn from(c: Cow<'a, T>) -> Self {
        match c {
            Cow::Borrowed(r) => Flex::Lend(r),
            Cow::Owned(b) => Flex::Give(b.into()),
        }
    }
}

#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
impl<'a, T: ?Sized + ToOwned> From<Flex<'a, T>> for Cow<'a, T>
where
    T::Owned: From<Box<T>>,
{
    fn from(c: Flex<'a, T>) -> Self {
        match c {
            Flex::Lend(r) => Cow::Borrowed(r),
            Flex::Give(b) => Cow::Owned(b.into()),
        }
    }
}