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)
97KB
2.5K
SLoC
mime
Support MIME (HTTP Media Types) as strong types in Rust.
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 astext/plain
. - A
MediaRange
is a range of types that an agent is willing to receive, such astext/*
.
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 MediaType
s
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
MediaRange
s 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 MediaRange
s, and then used to check if any of
the MediaType
s 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