use crate::*;
impl FromStr for Compress {
type Err = ();
#[inline(always)]
fn from_str(data: &str) -> Result<Self, Self::Err> {
match data.to_lowercase().as_str() {
_data if _data == CONTENT_ENCODING_GZIP => Ok(Self::Gzip),
_data if _data == CONTENT_ENCODING_DEFLATE => Ok(Self::Deflate),
_data if _data == CONTENT_ENCODING_BROTLI => Ok(Self::Br),
_ => Ok(Self::Unknown),
}
}
}
impl fmt::Display for Compress {
#[inline(always)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let display_str = match *self {
Compress::Gzip => CONTENT_ENCODING_GZIP,
Compress::Deflate => CONTENT_ENCODING_DEFLATE,
Compress::Br => CONTENT_ENCODING_BROTLI,
Compress::Unknown => EMPTY_STR,
};
write!(f, "{display_str}")
}
}
impl Compress {
#[inline(always)]
pub fn is_unknown(&self) -> bool {
*self == Self::Unknown
}
#[inline(always)]
pub fn from(header: &HashMap<String, String, BuildHasherDefault<XxHash3_64>>) -> Self {
header
.get(CONTENT_ENCODING)
.map(|value| value.parse::<Compress>().unwrap_or_default())
.unwrap_or_default()
}
pub fn decode<'a>(&self, data: &'a [u8], buffer_size: usize) -> Cow<'a, [u8]> {
match self {
Self::Gzip => gzip::decode(data, buffer_size),
Self::Deflate => deflate::decode(data, buffer_size),
Self::Br => brotli::decode(data, buffer_size),
Self::Unknown => Cow::Owned(data.to_vec()),
}
}
pub fn encode<'a>(&self, data: &'a [u8], buffer_size: usize) -> Cow<'a, [u8]> {
match self {
Self::Gzip => gzip::encode(data, buffer_size),
Self::Deflate => deflate::encode(data, buffer_size),
Self::Br => brotli::encode(data),
Self::Unknown => Cow::Owned(data.to_vec()),
}
}
}