use std::ops::Deref;
use ps_buffer::{Buffer, BufferError, SharedBuffer};
#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub enum Cow<'lt> {
Borrowed(&'lt [u8]),
Owned(SharedBuffer),
}
impl Cow<'_> {
pub fn try_into_buffer(self) -> Result<SharedBuffer, BufferError> {
match self {
Cow::Borrowed(value) => Ok(Buffer::from_slice(value)?.share()),
Cow::Owned(value) => Ok(value),
}
}
}
impl Deref for Cow<'_> {
type Target = [u8];
fn deref(&self) -> &Self::Target {
match self {
Self::Borrowed(value) => value,
Self::Owned(value) => value,
}
}
}
impl<'lt> From<&'lt [u8]> for Cow<'lt> {
fn from(value: &'lt [u8]) -> Self {
Self::Borrowed(value)
}
}
impl From<Buffer> for Cow<'_> {
fn from(value: Buffer) -> Self {
Self::Owned(value.share())
}
}
impl From<SharedBuffer> for Cow<'_> {
fn from(value: SharedBuffer) -> Self {
Self::Owned(value)
}
}