use headers::{Error, Header};
use hyper::header::{ACCEPT_ENCODING, HeaderName, HeaderValue};
use super::{ContentCoding, QualityValue};
#[derive(Clone, Debug)]
pub(crate) struct AcceptEncoding(QualityValue);
impl Header for AcceptEncoding {
fn name() -> &'static HeaderName {
&ACCEPT_ENCODING
}
fn decode<'i, I>(values: &mut I) -> Result<Self, Error>
where
I: Iterator<Item = &'i HeaderValue>,
{
QualityValue::try_from_values(values).map(Self)
}
fn encode<E: Extend<HeaderValue>>(&self, values: &mut E) {
values.extend(std::iter::once((&self.0).into()))
}
}
impl AcceptEncoding {
pub(crate) fn sorted_encodings(&self) -> impl Iterator<Item = ContentCoding> + '_ {
self.0.iter().map(ContentCoding::from)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_static() {
let val = HeaderValue::from_static("deflate, zstd;q=0.7, gzip;q=1.0, br;q=0.9");
let accept_enc = AcceptEncoding(val.into());
let mut encodings = accept_enc.sorted_encodings();
assert_eq!(encodings.next(), Some(ContentCoding::GZIP));
assert_eq!(encodings.next(), Some(ContentCoding::DEFLATE));
assert_eq!(encodings.next(), Some(ContentCoding::BROTLI));
assert_eq!(encodings.next(), Some(ContentCoding::ZSTD));
assert_eq!(encodings.next(), None);
}
}