mrmime 0.0.2

Small, explicit MIME type registry with fast lookup by type or extension.
use mrmime::{register_mime, MimeType};
use std::str::FromStr;

// A custom set to exercise behaviors independent of builtin set
register_mime! { mod testset {
    "application/vnd.demo+json" => [djson];
    "application/x-first" => [clash];
    "application/x-second" => [clash]; // shares extension 'clash'
    "application/x-7z-compressed" => ["7z"];
}}

#[test]
fn parse_basic_and_params_and_whitespace() {
    let m: MimeType = "  text/plain ; charset=UTF-8  ".parse().unwrap();
    assert_eq!(m.as_str(), "text/plain");
    assert_eq!(m.extension(), "txt");
}

#[test]
fn parse_suffix_type() {
    let m: MimeType = "application/vnd.demo+json".parse().unwrap();
    assert_eq!(m.as_str(), "application/vnd.demo+json");
    assert_eq!(m.extension(), "djson");
}

#[test]
fn error_missing_slash() {
    let e = MimeType::from_str("text").unwrap_err();
    assert!(matches!(e, mrmime::ParseError::MissingSlash));
}

#[test]
fn error_empty_type() {
    let e = MimeType::from_str("/plain").unwrap_err();
    assert!(matches!(e, mrmime::ParseError::EmptyType));
}

#[test]
fn error_empty_subtype() {
    let e = MimeType::from_str("text/").unwrap_err();
    assert!(matches!(e, mrmime::ParseError::EmptySubtype));
}

#[test]
fn error_not_registered() {
    let e = MimeType::from_str("application/unknown-type").unwrap_err();
    assert!(matches!(e, mrmime::ParseError::NotRegistered));
}

#[test]
fn extension_lookup_known_and_unknown() {
    let plain = MimeType::from_extension("txt").unwrap();
    assert_eq!(plain.as_str(), "text/plain");
    assert!(MimeType::from_extension("nope").is_none());
}

#[test]
fn extension_collision_first_wins() {
    let c = MimeType::from_extension("clash").unwrap();
    // Should be the first one registered with extension 'clash'
    assert_eq!(c.as_str(), "application/x-first");
}

#[test]
fn case_insensitive_extension_and_parse() {
    let a = MimeType::from_extension("TXT").unwrap();
    assert_eq!(a.as_str(), "text/plain");

    let b: MimeType = "TEXT/PLAIN".parse().unwrap();
    assert_eq!(b.as_str(), "text/plain");

    assert_eq!(a, b);
}