http_types/content/
encoding.rs

1use crate::headers::HeaderValue;
2use std::fmt::{self, Display};
3
4/// Available compression algorithms.
5#[non_exhaustive]
6#[derive(Debug, Clone, Copy, Eq, PartialEq)]
7pub enum Encoding {
8    /// The Gzip encoding.
9    Gzip,
10    /// The Deflate encoding.
11    Deflate,
12    /// The Brotli encoding.
13    Brotli,
14    /// The Zstd encoding.
15    Zstd,
16    /// No encoding.
17    Identity,
18}
19
20impl Encoding {
21    /// Parses a given string into its corresponding encoding.
22    pub(crate) fn from_str(s: &str) -> Option<Encoding> {
23        let s = s.trim();
24
25        // We're dealing with an empty string.
26        if s.is_empty() {
27            return None;
28        }
29
30        match s {
31            "gzip" => Some(Encoding::Gzip),
32            "deflate" => Some(Encoding::Deflate),
33            "br" => Some(Encoding::Brotli),
34            "zstd" => Some(Encoding::Zstd),
35            "identity" => Some(Encoding::Identity),
36            _ => None,
37        }
38    }
39}
40
41impl Display for Encoding {
42    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43        match self {
44            Encoding::Gzip => write!(f, "gzip"),
45            Encoding::Deflate => write!(f, "deflate"),
46            Encoding::Brotli => write!(f, "br"),
47            Encoding::Zstd => write!(f, "zstd"),
48            Encoding::Identity => write!(f, "identity"),
49        }
50    }
51}
52
53impl From<Encoding> for HeaderValue {
54    fn from(directive: Encoding) -> Self {
55        let s = directive.to_string();
56        unsafe { HeaderValue::from_bytes_unchecked(s.into_bytes()) }
57    }
58}