metamessage 0.1.20

MetaMessage (mm) is a structured data exchange protocol. It is self-describing, self-constraining, and self-exemplifying, enabling lossless data exchange. It is designed as a next-generation universal protocol that natively supports AI, humans, and machines.
Documentation
use std::collections::HashMap;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(non_camel_case_types)]
pub enum Mime {
    Unknown = 0,

    Jpeg = 1,
    Png = 2,
    Gif = 3,
    Webp = 4,
    Svg = 5,
    Avif = 6,
    Bmp = 7,
    Ico = 8,
    Tiff = 9,
    Heic = 10,
    Heif = 11,

    TextPlain = 12,
    Html = 13,
    Css = 14,
    JavaScript = 15,
    Json = 16,
    Csv = 17,
    Markdown = 18,

    Pdf = 19,
    Zip = 20,
    Gzip = 21,
    Tar = 22,
    Xlsx = 23,
    Docx = 24,
    OctetStream = 25,

    Mp4 = 26,
    Webm = 27,
    Mov = 28,

    Mp3 = 29,
    Wav = 30,
    Flac = 31,

    Woff2 = 32,
    Ttf = 33,
}

pub fn parse_mime(s: &str) -> u8 {
    let s = s.to_lowercase();
    let s = s.trim();
    let map = mime_str_to_id();
    map.get(s).copied().unwrap_or(Mime::Unknown as u8)
}

pub fn mime_to_str(id: u8) -> &'static str {
    match id {
        1 => "image/jpeg",
        2 => "image/png",
        3 => "image/gif",
        4 => "image/webp",
        5 => "image/svg+xml",
        6 => "image/avif",
        7 => "image/bmp",
        8 => "image/x-icon",
        9 => "image/tiff",
        10 => "image/heic",
        11 => "image/heif",
        12 => "text/plain",
        13 => "text/html",
        14 => "text/css",
        15 => "text/javascript",
        16 => "application/json",
        17 => "text/csv",
        18 => "text/markdown",
        19 => "application/pdf",
        20 => "application/zip",
        21 => "application/gzip",
        22 => "application/x-tar",
        23 => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        24 => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        25 => "application/octet-stream",
        26 => "video/mp4",
        27 => "video/webm",
        28 => "video/mov",
        29 => "audio/mpeg",
        30 => "audio/wav",
        31 => "audio/flac",
        32 => "font/woff2",
        33 => "font/ttf",
        _ => "unknown",
    }
}

fn mime_str_to_id() -> HashMap<&'static str, u8> {
    let mut m = HashMap::new();
    m.insert("image/jpeg", Mime::Jpeg as u8);
    m.insert("image/jpg", Mime::Jpeg as u8);
    m.insert("image/png", Mime::Png as u8);
    m.insert("image/gif", Mime::Gif as u8);
    m.insert("image/webp", Mime::Webp as u8);
    m.insert("image/svg+xml", Mime::Svg as u8);
    m.insert("image/avif", Mime::Avif as u8);
    m.insert("image/bmp", Mime::Bmp as u8);
    m.insert("image/x-icon", Mime::Ico as u8);
    m.insert("image/tiff", Mime::Tiff as u8);
    m.insert("image/heic", Mime::Heic as u8);
    m.insert("image/heif", Mime::Heif as u8);
    m.insert("text/plain", Mime::TextPlain as u8);
    m.insert("text/html", Mime::Html as u8);
    m.insert("text/css", Mime::Css as u8);
    m.insert("text/javascript", Mime::JavaScript as u8);
    m.insert("application/json", Mime::Json as u8);
    m.insert("text/csv", Mime::Csv as u8);
    m.insert("text/markdown", Mime::Markdown as u8);
    m.insert("application/pdf", Mime::Pdf as u8);
    m.insert("application/zip", Mime::Zip as u8);
    m.insert("application/gzip", Mime::Gzip as u8);
    m.insert("application/x-tar", Mime::Tar as u8);
    m.insert(
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        Mime::Xlsx as u8,
    );
    m.insert(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        Mime::Docx as u8,
    );
    m.insert("application/octet-stream", Mime::OctetStream as u8);
    m.insert("video/mp4", Mime::Mp4 as u8);
    m.insert("video/webm", Mime::Webm as u8);
    m.insert("video/mov", Mime::Mov as u8);
    m.insert("audio/mpeg", Mime::Mp3 as u8);
    m.insert("audio/wav", Mime::Wav as u8);
    m.insert("audio/flac", Mime::Flac as u8);
    m.insert("font/woff2", Mime::Woff2 as u8);
    m.insert("font/ttf", Mime::Ttf as u8);
    m
}