1use std::ops::Deref;
2
3use ps_buffer::{Buffer, BufferError, SharedBuffer};
4
5#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
6pub enum Cow<'lt> {
7 Borrowed(&'lt [u8]),
8 Owned(SharedBuffer),
9}
10
11impl Cow<'_> {
12 pub fn try_into_buffer(self) -> Result<SharedBuffer, BufferError> {
18 match self {
19 Cow::Borrowed(value) => Ok(Buffer::from_slice(value)?.share()),
20 Cow::Owned(value) => Ok(value),
21 }
22 }
23}
24
25impl Deref for Cow<'_> {
26 type Target = [u8];
27
28 fn deref(&self) -> &Self::Target {
29 match self {
30 Self::Borrowed(value) => value,
31 Self::Owned(value) => value,
32 }
33 }
34}
35
36impl<'lt> From<&'lt [u8]> for Cow<'lt> {
37 fn from(value: &'lt [u8]) -> Self {
38 Self::Borrowed(value)
39 }
40}
41
42impl From<Buffer> for Cow<'_> {
43 fn from(value: Buffer) -> Self {
44 Self::Owned(value.share())
45 }
46}
47
48impl From<SharedBuffer> for Cow<'_> {
49 fn from(value: SharedBuffer) -> Self {
50 Self::Owned(value)
51 }
52}