use std::borrow::Cow;
use ::bstr::{BStr, BString};
pub trait AsBStr {
fn as_bstr(&self) -> &BStr;
}
pub trait AsBStrOpt {
fn as_bstr_opt(&self) -> Option<&BStr>;
}
impl<T: AsBStr + ?Sized> AsBStrOpt for T {
fn as_bstr_opt(&self) -> Option<&BStr> {
Some(self.as_bstr())
}
}
impl AsBStrOpt for Option<&BStr> {
fn as_bstr_opt(&self) -> Option<&BStr> {
*self
}
}
impl<T: AsBStr + ?Sized> AsBStr for &T {
fn as_bstr(&self) -> &BStr {
T::as_bstr(self)
}
}
impl<T: AsBStr + ?Sized> AsBStr for &mut T {
fn as_bstr(&self) -> &BStr {
T::as_bstr(self)
}
}
impl AsBStr for BStr {
fn as_bstr(&self) -> &BStr {
self
}
}
impl AsBStr for BString {
fn as_bstr(&self) -> &BStr {
BStr::new(self.as_slice())
}
}
impl AsBStr for str {
fn as_bstr(&self) -> &BStr {
BStr::new(self)
}
}
impl AsBStr for String {
fn as_bstr(&self) -> &BStr {
BStr::new(self)
}
}
impl AsBStr for [u8] {
fn as_bstr(&self) -> &BStr {
BStr::new(self)
}
}
impl AsBStr for Vec<u8> {
fn as_bstr(&self) -> &BStr {
BStr::new(self)
}
}
impl<const N: usize> AsBStr for [u8; N] {
fn as_bstr(&self) -> &BStr {
BStr::new(self)
}
}
impl<T> AsBStr for Cow<'_, T>
where
T: AsBStr + ToOwned + ?Sized,
{
fn as_bstr(&self) -> &BStr {
self.as_ref().as_bstr()
}
}