mime_type/
image.rs

1use crate::MimeFormat;
2use std::fmt::{self, Display, Formatter};
3
4/// Image file formats.
5///
6/// Supports common image formats including raster and vector types.
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub enum Image {
9    /// JPEG image format
10    Jpeg,
11    /// PNG image format
12    Png,
13    /// GIF image format
14    Gif,
15    /// WebP image format
16    Webp,
17    /// Canon Raw 2 format
18    Cr2,
19    /// TIFF image format
20    Tif,
21    /// BMP image format
22    Bmp,
23    /// HEIF image format
24    Heif,
25    /// AVIF image format
26    Avif,
27    /// JPEG XR format
28    Jxr,
29    /// Adobe Photoshop document
30    Psd,
31    /// ICO icon format
32    Ico,
33    /// OpenRaster format
34    Ora,
35    /// DjVu document format
36    Djvu,
37}
38
39impl Display for Image {
40    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
41        let mime_str = match self {
42            Image::Jpeg => "image/jpeg",
43            Image::Png => "image/png",
44            Image::Gif => "image/gif",
45            Image::Webp => "image/webp",
46            Image::Cr2 => "image/x-canon-cr2",
47            Image::Tif => "image/tiff",
48            Image::Bmp => "image/bmp",
49            Image::Heif => "image/heif",
50            Image::Avif => "image/avif",
51            Image::Jxr => "image/vnd.ms-photo",
52            Image::Psd => "image/vnd.adobe.photoshop",
53            Image::Ico => "image/vnd.microsoft.icon",
54            Image::Ora => "image/openraster",
55            Image::Djvu => "image/vnd.djvu",
56        };
57        write!(f, "{}", mime_str)
58    }
59}
60
61impl MimeFormat for Image {
62    fn from_ext(ext: &str) -> Option<crate::MimeType> {
63        match ext {
64            "jpg" | "jpeg" => Some(crate::MimeType::Image(Image::Jpeg)),
65            "png" => Some(crate::MimeType::Image(Image::Png)),
66            "gif" => Some(crate::MimeType::Image(Image::Gif)),
67            "webp" => Some(crate::MimeType::Image(Image::Webp)),
68            "cr2" => Some(crate::MimeType::Image(Image::Cr2)),
69            "tif" | "tiff" => Some(crate::MimeType::Image(Image::Tif)),
70            "bmp" => Some(crate::MimeType::Image(Image::Bmp)),
71            "heif" => Some(crate::MimeType::Image(Image::Heif)),
72            "avif" => Some(crate::MimeType::Image(Image::Avif)),
73            "jxr" => Some(crate::MimeType::Image(Image::Jxr)),
74            "psd" => Some(crate::MimeType::Image(Image::Psd)),
75            "ico" => Some(crate::MimeType::Image(Image::Ico)),
76            "ora" => Some(crate::MimeType::Image(Image::Ora)),
77            "djvu" => Some(crate::MimeType::Image(Image::Djvu)),
78            _ => None,
79        }
80    }
81
82    fn from_mime(mime: &str) -> Option<crate::MimeType> {
83        match mime {
84            "image/jpeg" => Some(crate::MimeType::Image(Image::Jpeg)),
85            "image/png" => Some(crate::MimeType::Image(Image::Png)),
86            "image/gif" => Some(crate::MimeType::Image(Image::Gif)),
87            "image/webp" => Some(crate::MimeType::Image(Image::Webp)),
88            "image/x-canon-cr2" => Some(crate::MimeType::Image(Image::Cr2)),
89            "image/tiff" => Some(crate::MimeType::Image(Image::Tif)),
90            "image/bmp" => Some(crate::MimeType::Image(Image::Bmp)),
91            "image/heif" => Some(crate::MimeType::Image(Image::Heif)),
92            "image/avif" => Some(crate::MimeType::Image(Image::Avif)),
93            "image/vnd.ms-photo" => Some(crate::MimeType::Image(Image::Jxr)),
94            "image/vnd.adobe.photoshop" => Some(crate::MimeType::Image(Image::Psd)),
95            "image/vnd.microsoft.icon" => Some(crate::MimeType::Image(Image::Ico)),
96            "image/openraster" => Some(crate::MimeType::Image(Image::Ora)),
97            "image/vnd.djvu" => Some(crate::MimeType::Image(Image::Djvu)),
98            _ => None,
99        }
100    }
101}