1 unstable release

0.4.0-a.0 Jan 29, 2021

#7 in #media-extensions

47 downloads per month
Used in 10 crates (via site_icons)

MIT license

97KB
2.5K SLoC

mime

Build Status crates.io docs.rs

Support MIME (HTTP Media Types) as strong types in Rust.

Documentation

Usage

extern crate mime;

fn main() {
    // common types are constants
    let text = mime::TEXT_PLAIN;

    // deconstruct Mimes to match on them
    match (text.type_(), text.subtype()) {
        (mime::TEXT, mime::PLAIN) => {
            // plain text!
        },
        (mime::TEXT, _) => {
            // structured text!
        },
        _ => {
            // not text!
        }
    }
}

lib.rs:

MediaType and MediaRange

The mime crate defines two major types for representing MIMEs in HTTP contexts:

  • A MediaType is a concrete description of some content, such as text/plain.
  • A MediaRange is a range of types that an agent is willing to receive, such as text/*.

Getting a MediaType

There are several constants exported for common media types:

let text = mime::TEXT_PLAIN;
let svg = mime::IMAGE_SVG;
let json = mime::APPLICATION_JSON;
// etc

A MediaType can also be parsed from a string, such as from a Content-Type HTTP header:

match mime::MediaType::parse("text/plain; charset=utf-8") {
    Ok(text) => assert_eq!(text, mime::TEXT_PLAIN_UTF_8),
    Err(err) => panic!("you should handle this parse error: {}", err),
}

Inspecting MediaTypes

Once you have a MediaType, you can inspect the various parts of it. Since the type_() and subtype() methods return &str, you can make easy-to-read match statements to handle different media types. To prevent typos, many common type names are available as constants.

let mime = mime::TEXT_PLAIN;
match (mime.type_(), mime.subtype()) {
    (mime::TEXT, mime::PLAIN) => println!("plain text!"),
    (mime::TEXT, _) => println!("structured text"),
    _ => println!("not text"),
}

Using Media Ranges for matching

MediaRanges are often used by agents to declare a "range" of media types that they can understand. A common place to find these is Accept HTTP header, perhaps like this:

GET /index.html HTTP/1.1
Accept: text/html, text/*

These can be parsed as MediaRanges, and then used to check if any of the MediaTypes you have would satisfy them.

match mime::MediaRange::parse("text/*") {
    Ok(range) => {
        // There's a couple constants in case you don't need parsing...
        assert_eq!(range, mime::TEXT_STAR);

        // "text/plain" is a match
        assert!(range.matches(&mime::TEXT_PLAIN));

        // "application/json" is NOT
        assert!(!range.matches(&mime::APPLICATION_JSON));

    },
    Err(err) => panic!("that's a bad range: {}", err),
}

Dependencies

~95–455KB
~10K SLoC