1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use std::{convert::Infallible, fmt::Display, str::FromStr};

pub enum Header {
    ContentType,
    Proof,
    Author,
    Title,
    Signature,
    Version,
    FileExtension,
    Unknown(String),
}

impl Display for Header {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let value = match self {
            Header::ContentType => "Content-Type",
            Header::Proof => "Proof",
            Header::Author => "Author",
            Header::Title => "Title",
            Header::Signature => "Signature",
            Header::Version => "Version",
            Header::FileExtension => "File-Extension",
            Header::Unknown(name) => name,
        };

        write!(f, "{}", value)
    }
}

impl FromStr for Header {
    type Err = Infallible;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Ok(match s.to_lowercase().as_str() {
            "content-type" => Header::ContentType,
            "file-extension" => Header::FileExtension,
            "proof" => Header::Proof,
            "author" => Header::Author,
            "title" => Header::Title,
            "signature" => Header::Signature,
            "version" => Header::Version,
            _ => Header::Unknown(s.to_string()),
        })
    }
}