http_types/content/
content_encoding.rsuse crate::content::{Encoding, EncodingProposal};
use crate::headers::{HeaderName, HeaderValue, Headers, ToHeaderValues, CONTENT_ENCODING};
use std::fmt::{self, Debug};
use std::ops::{Deref, DerefMut};
use std::option;
pub struct ContentEncoding {
inner: Encoding,
}
impl ContentEncoding {
pub fn new(encoding: Encoding) -> Self {
Self { inner: encoding }
}
pub fn from_headers(headers: impl AsRef<Headers>) -> crate::Result<Option<Self>> {
let headers = match headers.as_ref().get(CONTENT_ENCODING) {
Some(headers) => headers,
None => return Ok(None),
};
let mut inner = None;
for value in headers {
if let Some(entry) = Encoding::from_str(value.as_str()) {
inner = Some(entry);
}
}
let inner = inner.expect("Headers instance with no entries found");
Ok(Some(Self { inner }))
}
pub fn apply(&self, mut headers: impl AsMut<Headers>) {
headers.as_mut().insert(CONTENT_ENCODING, self.value());
}
pub fn name(&self) -> HeaderName {
CONTENT_ENCODING
}
pub fn value(&self) -> HeaderValue {
self.inner.into()
}
pub fn encoding(&self) -> Encoding {
self.inner
}
}
impl ToHeaderValues for ContentEncoding {
type Iter = option::IntoIter<HeaderValue>;
fn to_header_values(&self) -> crate::Result<Self::Iter> {
Ok(self.value().to_header_values().unwrap())
}
}
impl Deref for ContentEncoding {
type Target = Encoding;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl DerefMut for ContentEncoding {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl PartialEq<Encoding> for ContentEncoding {
fn eq(&self, other: &Encoding) -> bool {
&self.inner == other
}
}
impl PartialEq<&Encoding> for ContentEncoding {
fn eq(&self, other: &&Encoding) -> bool {
&&self.inner == other
}
}
impl From<Encoding> for ContentEncoding {
fn from(encoding: Encoding) -> Self {
Self { inner: encoding }
}
}
impl From<&Encoding> for ContentEncoding {
fn from(encoding: &Encoding) -> Self {
Self { inner: *encoding }
}
}
impl From<EncodingProposal> for ContentEncoding {
fn from(encoding: EncodingProposal) -> Self {
Self {
inner: encoding.encoding,
}
}
}
impl From<&EncodingProposal> for ContentEncoding {
fn from(encoding: &EncodingProposal) -> Self {
Self {
inner: encoding.encoding,
}
}
}
impl Debug for ContentEncoding {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.inner.fmt(f)
}
}