use crate::hash::{BlobHash, TextHash};
use hex::serde::{deserialize, serialize};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::borrow::Cow;
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub struct Bytes<'a> {
inner: Cow<'a, [u8]>,
}
impl<'a> Bytes<'a> {
#[inline]
pub fn len(&self) -> usize {
self.inner.as_ref().len()
}
}
impl AsRef<[u8]> for Bytes<'_> {
#[inline]
fn as_ref(&self) -> &[u8] {
&self.inner
}
}
impl From<Bytes<'_>> for Vec<u8> {
#[inline]
fn from(bytes: Bytes) -> Vec<u8> {
bytes.inner.into_owned()
}
}
impl From<Vec<u8>> for Bytes<'static> {
#[inline]
fn from(bytes: Vec<u8>) -> Bytes<'static> {
Bytes {
inner: Cow::Owned(bytes),
}
}
}
impl From<BlobHash> for Bytes<'static> {
#[inline]
fn from(hash: BlobHash) -> Bytes<'static> {
Bytes::from(hash.to_vec())
}
}
impl From<TextHash> for Bytes<'static> {
#[inline]
fn from(hash: TextHash) -> Bytes<'static> {
Bytes::from(hash.to_vec())
}
}
impl<'a> From<&'a [u8]> for Bytes<'a> {
#[inline]
fn from(bytes: &'a [u8]) -> Bytes<'a> {
Bytes {
inner: Cow::Borrowed(bytes),
}
}
}
impl Default for Bytes<'static> {
#[inline]
fn default() -> Bytes<'static> {
Bytes {
inner: Cow::Owned(Vec::new()),
}
}
}
impl<'a> Serialize for Bytes<'a> {
#[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serialize(self, serializer)
}
}
impl<'de> Deserialize<'de> for Bytes<'static> {
#[inline]
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let bytes: Vec<u8> = deserialize(deserializer)?;
Ok(Self::from(bytes))
}
}