mime_type/
lib.rs

1//! MIME type definitions and conversions for Rust.
2//!
3//! This crate provides type-safe MIME type handling with support for converting
4//! between file extensions and MIME type strings.
5//!
6//! # Examples
7//!
8//! ```
9//! use mime_type::{MimeType, MimeFormat};
10//!
11//! // Get MIME type from file extension
12//! let mime = MimeType::from_ext("png").unwrap();
13//! assert_eq!(mime.to_string(), "image/png");
14//!
15//! // Get MIME type from MIME string
16//! let mime = MimeType::from_mime("video/mp4").unwrap();
17//! ```
18
19mod application;
20mod archive;
21mod audio;
22mod book;
23mod document;
24mod font;
25mod image;
26mod mime_format;
27mod video;
28
29use std::fmt::{self, Display, Formatter};
30
31pub use application::Application;
32pub use archive::Archive;
33pub use audio::Audio;
34pub use book::Book;
35pub use document::Document;
36pub use font::Font;
37pub use image::Image;
38pub use mime_format::MimeFormat;
39pub use video::Video;
40
41/// Main MIME type enum containing all supported categories.
42///
43/// This enum wraps the specific MIME type categories (Image, Video, Audio, etc.)
44/// and implements conversion from file extensions and MIME strings.
45#[derive(Debug, Clone, PartialEq, Eq)]
46pub enum MimeType {
47    /// Image formats (JPEG, PNG, GIF, etc.)
48    Image(Image),
49    /// Video formats (MP4, MKV, WebM, etc.)
50    Video(Video),
51    /// Audio formats (MP3, FLAC, WAV, etc.)
52    Audio(Audio),
53    /// Archive and compressed formats (ZIP, TAR, RAR, etc.)
54    Archive(Archive),
55    /// E-book formats (EPUB, MOBI)
56    Book(Book),
57    /// Document formats (DOC, PDF, XLS, etc.)
58    Document(Document),
59    /// Font formats (TTF, OTF, WOFF, etc.)
60    Font(Font),
61    /// Application and executable formats (EXE, WASM, ELF, etc.)
62    Application(Application),
63}
64
65impl Display for MimeType {
66    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
67        match self {
68            MimeType::Image(img) => write!(f, "{}", img),
69            MimeType::Video(vid) => write!(f, "{}", vid),
70            MimeType::Audio(aud) => write!(f, "{}", aud),
71            MimeType::Archive(arch) => write!(f, "{}", arch),
72            MimeType::Book(book) => write!(f, "{}", book),
73            MimeType::Document(doc) => write!(f, "{}", doc),
74            MimeType::Font(font) => write!(f, "{}", font),
75            MimeType::Application(app) => write!(f, "{}", app),
76        }
77    }
78}
79
80impl MimeFormat for MimeType {
81    fn from_ext(ext: &str) -> Option<MimeType> {
82        Image::from_ext(ext)
83            .or_else(|| Video::from_ext(ext))
84            .or_else(|| Audio::from_ext(ext))
85            .or_else(|| Archive::from_ext(ext))
86            .or_else(|| Book::from_ext(ext))
87            .or_else(|| Document::from_ext(ext))
88            .or_else(|| Font::from_ext(ext))
89            .or_else(|| Application::from_ext(ext))
90    }
91
92    fn from_mime(mime: &str) -> Option<MimeType> {
93        Image::from_mime(mime)
94            .or_else(|| Video::from_mime(mime))
95            .or_else(|| Audio::from_mime(mime))
96            .or_else(|| Archive::from_mime(mime))
97            .or_else(|| Book::from_mime(mime))
98            .or_else(|| Document::from_mime(mime))
99            .or_else(|| Font::from_mime(mime))
100            .or_else(|| Application::from_mime(mime))
101    }
102}