mime_type/
document.rs

1use crate::MimeFormat;
2use std::fmt::{self, Display, Formatter};
3
4/// Document file formats.
5///
6/// Supports Microsoft Office and OpenDocument formats.
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub enum Document {
9    /// Microsoft Word document
10    Doc,
11    /// Microsoft Word document (Office Open XML)
12    Docx,
13    /// Microsoft Excel spreadsheet
14    Xls,
15    /// Microsoft Excel spreadsheet (Office Open XML)
16    Xlsx,
17    /// Microsoft PowerPoint presentation
18    Ppt,
19    /// Microsoft PowerPoint presentation (Office Open XML)
20    Pptx,
21    /// OpenDocument text document
22    Odt,
23    /// OpenDocument spreadsheet
24    Ods,
25    /// OpenDocument presentation
26    Odp,
27}
28
29impl Display for Document {
30    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
31        let mime_str = match self {
32            Document::Doc => "application/msword",
33            Document::Docx => {
34                "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
35            }
36            Document::Xls => "application/vnd.ms-excel",
37            Document::Xlsx => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
38            Document::Ppt => "application/vnd.ms-powerpoint",
39            Document::Pptx => {
40                "application/vnd.openxmlformats-officedocument.presentationml.presentation"
41            }
42            Document::Odt => "application/vnd.oasis.opendocument.text",
43            Document::Ods => "application/vnd.oasis.opendocument.spreadsheet",
44            Document::Odp => "application/vnd.oasis.opendocument.presentation",
45        };
46        write!(f, "{}", mime_str)
47    }
48}
49
50impl MimeFormat for Document {
51    fn from_ext(ext: &str) -> Option<crate::MimeType> {
52        match ext {
53            "doc" => Some(crate::MimeType::Document(Document::Doc)),
54            "docx" => Some(crate::MimeType::Document(Document::Docx)),
55            "xls" => Some(crate::MimeType::Document(Document::Xls)),
56            "xlsx" => Some(crate::MimeType::Document(Document::Xlsx)),
57            "ppt" => Some(crate::MimeType::Document(Document::Ppt)),
58            "pptx" => Some(crate::MimeType::Document(Document::Pptx)),
59            "odt" => Some(crate::MimeType::Document(Document::Odt)),
60            "ods" => Some(crate::MimeType::Document(Document::Ods)),
61            "odp" => Some(crate::MimeType::Document(Document::Odp)),
62            _ => None,
63        }
64    }
65
66    fn from_mime(mime: &str) -> Option<crate::MimeType> {
67        match mime {
68            "application/msword" => Some(crate::MimeType::Document(Document::Doc)),
69            "application/vnd.openxmlformats-officedocument.wordprocessingml.document" => {
70                Some(crate::MimeType::Document(Document::Docx))
71            }
72            "application/vnd.ms-excel" => Some(crate::MimeType::Document(Document::Xls)),
73            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" => {
74                Some(crate::MimeType::Document(Document::Xlsx))
75            }
76            "application/vnd.ms-powerpoint" => Some(crate::MimeType::Document(Document::Ppt)),
77            "application/vnd.openxmlformats-officedocument.presentationml.presentation" => {
78                Some(crate::MimeType::Document(Document::Pptx))
79            }
80            "application/vnd.oasis.opendocument.text" => {
81                Some(crate::MimeType::Document(Document::Odt))
82            }
83            "application/vnd.oasis.opendocument.spreadsheet" => {
84                Some(crate::MimeType::Document(Document::Ods))
85            }
86            "application/vnd.oasis.opendocument.presentation" => {
87                Some(crate::MimeType::Document(Document::Odp))
88            }
89            _ => None,
90        }
91    }
92}