mrmime 0.0.2

Small, explicit MIME type registry with fast lookup by type or extension.
//! Built-in curated MIME registrations (enabled by default via the `builtin`
//! feature). Disable with `default-features = false` if you want to provide
//! your own set.
//!
//! This module also exposes named constants for common types, e.g.
//! `mrmime::builtin::TEXT_HTML`, `mrmime::builtin::APPLICATION_JSON`, etc.

// Define the builtin list exactly once; each entry -> MIME literal, extensions,
// constant name
#[cfg(feature = "builtin")]
macro_rules! __builtin_list {
    ($mac:ident) => {
        $mac! {
            // Text
            "text/plain"          => [txt, text]        => TEXT_PLAIN;
            "text/html"           => [html, htm]        => TEXT_HTML;
            "text/css"            => [css]              => TEXT_CSS;
            "text/csv"            => [csv]              => TEXT_CSV;
            "text/markdown"       => [md, markdown]     => TEXT_MARKDOWN;

            // Script / data
            "application/javascript" => [js, mjs]       => APPLICATION_JAVASCRIPT;
            "text/javascript"     => [js]               => TEXT_JAVASCRIPT;
            "application/json"    => [json, map]        => APPLICATION_JSON;
            "application/xml"     => [xml]              => APPLICATION_XML;

            // Images
            "image/jpeg"          => [jpg, jpeg]        => IMAGE_JPEG;
            "image/png"           => [png]              => IMAGE_PNG;
            "image/gif"           => [gif]              => IMAGE_GIF;
            "image/webp"          => [webp]             => IMAGE_WEBP;
            "image/avif"          => [avif]             => IMAGE_AVIF;
            "image/svg+xml"       => [svg]              => IMAGE_SVG_XML;
            "image/bmp"           => [bmp]              => IMAGE_BMP;
            "image/tiff"          => [tif, tiff]        => IMAGE_TIFF;
            "image/heic"          => [heic]             => IMAGE_HEIC;
            "image/heif"          => [heif]             => IMAGE_HEIF;
            "image/x-icon"        => [ico]              => IMAGE_X_ICON;

            // Audio
            "audio/mpeg"          => [mp3]              => AUDIO_MPEG;
            "audio/wav"           => [wav]              => AUDIO_WAV;
            "audio/x-wav"         => [wav]              => AUDIO_X_WAV;
            "audio/ogg"           => [ogg]              => AUDIO_OGG;
            "audio/flac"           => [flac]              => AUDIO_FLAC;
            "audio/aac"           => [aac]              => AUDIO_AAC;
            "audio/mp4"           => [m4a]              => AUDIO_MP4;
            "audio/x-m4a"         => [m4a]              => AUDIO_X_M4A;
            "audio/opus"          => [opus]             => AUDIO_OPUS;
            "audio/webm"          => [weba]             => AUDIO_WEBM;
            "audio/l16"           => [l16]              => AUDIO_L16;

            // Video
            "video/mp4"           => [mp4]              => VIDEO_MP4;
            "video/x-matroska"    => [mkv]              => VIDEO_X_MATROSKA;
            "video/webm"          => [webm]             => VIDEO_WEBM;
            "video/x-msvideo"     => [avi]              => VIDEO_X_MSVIDEO;
            "video/quicktime"     => [mov]              => VIDEO_QUICKTIME;
            "video/ogg"           => [ogv]              => VIDEO_OGG;

            // Documents & archives
            "application/pdf"     => [pdf]              => APPLICATION_PDF;
            "application/zip"     => [zip]              => APPLICATION_ZIP;
            "application/gzip"    => [gz]               => APPLICATION_GZIP;
            "application/x-bzip2" => [bz2]              => APPLICATION_X_BZIP2;
            "application/x-xz"    => [xz]               => APPLICATION_X_XZ;
            "application/x-tar"   => [tar]              => APPLICATION_X_TAR;
            "application/octet-stream" => [bin]         => APPLICATION_OCTET_STREAM;

            // Fonts
            "font/ttf"            => [ttf]              => FONT_TTF;
            "font/otf"            => [otf]              => FONT_OTF;
            "font/woff"           => [woff]             => FONT_WOFF;
            "font/woff2"          => [woff2]            => FONT_WOFF2;

            // Office
            "application/vnd.ms-excel" => [xls]         => APPLICATION_VND_MS_EXCEL;
            "application/vnd.openxmlformats-officedocument/spreadsheetml.sheet" => [xlsx] => APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_SPREADSHEETML_SHEET;
            "application/msword"  => [doc]              => APPLICATION_MSWORD;
            "application/vnd.openxmlformats-officedocument.wordprocessingml.document" => [docx] => APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_WORDPROCESSINGML_DOCUMENT;
            "application/vnd.ms-powerpoint" => [ppt]    => APPLICATION_VND_MS_POWERPOINT;
            "application/vnd.openxmlformats-officedocument.presentationml.presentation" => [pptx] => APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_PRESENTATIONML_PRESENTATION;
            "application/rtf"     => [rtf]              => APPLICATION_RTF;
            "application/wasm"    => [wasm]             => APPLICATION_WASM;
        }
    };
}

#[cfg(feature = "builtin")]
macro_rules! __register_builtin { ( $( $mime:literal => [ $( $ext:ident ),+ ] => $const:ident; )+ ) => {
    register_mime! { mod builtin_block { $( $mime => [ $( $ext ),+ ]; )+ } }
} }

#[cfg(feature = "builtin")]
macro_rules! __emit_builtin_consts { ( $( $mime:literal => [ $( $ext:ident ),+ ] => $const:ident; )+ ) => {
    use crate::MimeType;
    $( #[doc = concat!("Built-in MIME type: ", $mime)] pub const $const: MimeType = MimeType { mime: $mime, exts: &[ $( stringify!($ext) ),+ ] }; )+
} }

#[cfg(feature = "builtin")]
__builtin_list!(__register_builtin);
#[cfg(feature = "builtin")]
__builtin_list!(__emit_builtin_consts);

// Intentionally do not expose the internal registration block.