use bytes::Bytes;
pub use bytes::BytesMut as Builder;
#[derive(Debug, Clone, Eq, Hash, Ord)]
pub struct Slice(pub(super) Bytes);
impl Slice {
#[must_use]
pub fn new(bytes: &[u8]) -> Self {
Self(Bytes::copy_from_slice(bytes))
}
#[doc(hidden)]
#[must_use]
pub fn empty() -> Self {
Self(Bytes::from_static(&[]))
}
#[doc(hidden)]
#[must_use]
pub unsafe fn builder_unzeroed(len: usize) -> Builder {
let mut builder = Builder::with_capacity(len);
#[expect(unsafe_code, reason = "see safety")]
unsafe {
builder.set_len(len);
}
builder
}
#[doc(hidden)]
#[must_use]
pub fn slice(&self, range: impl std::ops::RangeBounds<usize>) -> Self {
Self(self.0.slice(range))
}
#[doc(hidden)]
#[must_use]
pub fn fused(left: &[u8], right: &[u8]) -> Self {
use std::io::Write;
let len = left.len() + right.len();
let mut builder = unsafe { Self::builder_unzeroed(len) };
{
let mut writer = &mut builder[..];
#[expect(
clippy::expect_used,
reason = "writing into a pre-allocated buffer of exact size cannot fail"
)]
writer.write_all(left).expect("should write");
#[expect(
clippy::expect_used,
reason = "writing into a pre-allocated buffer of exact size cannot fail"
)]
writer.write_all(right).expect("should write");
}
Self(builder.freeze())
}
#[doc(hidden)]
pub fn from_reader<R: std::io::Read>(reader: &mut R, len: usize) -> std::io::Result<Self> {
let mut builder = unsafe { Self::builder_unzeroed(len) };
reader.read_exact(&mut builder)?;
Ok(Self(builder.freeze()))
}
}
impl From<Bytes> for Slice {
fn from(value: Bytes) -> Self {
Self(value)
}
}
impl From<Slice> for Bytes {
fn from(value: Slice) -> Self {
value.0
}
}
impl From<Vec<u8>> for Slice {
fn from(value: Vec<u8>) -> Self {
Self(Bytes::from(value))
}
}
impl From<String> for Slice {
fn from(value: String) -> Self {
Self(Bytes::from(value))
}
}