use std::ops::{Deref, Range};
pub trait Buffer: Deref<Target = [u8]> + Sized {
type BufferString: Deref<Target = str> + Sized + serde::ser::Serialize;
fn slice(&self, range: Range<usize>) -> Option<Self>;
#[inline]
fn shallow_copy(&self) -> Self {
self.slice(0..self.len()).unwrap()
}
fn empty() -> Self;
#[inline]
fn empty_str() -> Self::BufferString {
Self::empty().buffer_str().unwrap()
}
fn buffer_str(&self) -> Result<Self::BufferString, std::str::Utf8Error>;
}
impl<'de> Buffer for &'de [u8] {
type BufferString = &'de str;
#[inline]
fn slice(&self, range: Range<usize>) -> Option<Self> {
self.get(range)
}
#[inline]
fn empty() -> Self {
&[]
}
#[inline]
fn empty_str() -> Self::BufferString {
""
}
#[inline]
fn buffer_str(&self) -> Result<Self::BufferString, std::str::Utf8Error> {
std::str::from_utf8(self)
}
}