46 lines
1.0 KiB
Rust
46 lines
1.0 KiB
Rust
use std::ops::Deref;
|
|
use std::str;
|
|
|
|
use bytes::Bytes;
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
|
pub struct ByteStr(Bytes);
|
|
|
|
impl ByteStr {
|
|
pub unsafe fn from_utf8_unchecked(slice: Bytes) -> ByteStr {
|
|
ByteStr(slice)
|
|
}
|
|
|
|
pub fn from_static(s: &'static str) -> ByteStr {
|
|
ByteStr(Bytes::from_static(s.as_bytes()))
|
|
}
|
|
|
|
pub fn slice(&self, from: usize, to: usize) -> ByteStr {
|
|
assert!(self.as_str().is_char_boundary(from));
|
|
assert!(self.as_str().is_char_boundary(to));
|
|
ByteStr(self.0.slice(from, to))
|
|
}
|
|
|
|
pub fn slice_to(&self, idx: usize) -> ByteStr {
|
|
assert!(self.as_str().is_char_boundary(idx));
|
|
ByteStr(self.0.slice_to(idx))
|
|
}
|
|
|
|
pub fn as_str(&self) -> &str {
|
|
unsafe { str::from_utf8_unchecked(self.0.as_ref()) }
|
|
}
|
|
}
|
|
|
|
impl Deref for ByteStr {
|
|
type Target = str;
|
|
fn deref(&self) -> &str {
|
|
self.as_str()
|
|
}
|
|
}
|
|
|
|
impl<'a> From<&'a str> for ByteStr {
|
|
fn from(s: &'a str) -> ByteStr {
|
|
ByteStr(Bytes::from(s))
|
|
}
|
|
}
|