47 releases
0.19.18 | Jan 30, 2024 |
---|---|
0.19.16 | Nov 25, 2023 |
0.19.15 | Jul 2, 2023 |
0.19.13 | Jan 23, 2023 |
0.19.1 | Feb 28, 2022 |
#58 in Parser implementations
103,719 downloads per month
Used in 75 crates
(29 directly)
290KB
1.5K
SLoC
Parsing
MediaType::parse
runs a zero-copy parsing: A MediaType
borrows the input string instead of copying it.
If you need an owned type, use MediaTypeBuf
.
use mediatype::{names::*, values::*, MediaType};
let madia_type = "image/svg+xml; charset=UTF-8";
let svg = MediaType::parse(madia_type).unwrap();
assert_eq!(svg.ty, IMAGE);
assert_eq!(svg.subty, SVG);
assert_eq!(svg.suffix, Some(XML));
assert_eq!(svg.get_param(CHARSET), Some(UTF_8));
Construction
MediaType
is const-constructible. It can be defined as a constant.
Predefind names and values are defined in names
and values
modules.
use mediatype::{names::*, values::*, media_type, MediaType};
const TEXT_PLAIN: MediaType = MediaType::new(TEXT, PLAIN);
const IMAGE_SVG: MediaType =
MediaType::from_parts(TEXT, PLAIN, Some(XML), &[(CHARSET, UTF_8)]);
const TEXT_MARKDOWN: MediaType =
media_type!(TEXT/MARKDOWN; CHARSET=UTF_8);
Parameters
Case Sensitivity
Comparisons are case-insensitive except parameter values.
let text_plain_lower = MediaType::parse("text/plain; charset=UTF-8").unwrap();
let text_plain_upper = MediaType::parse("TEXT/PLAIN; CHARSET=UTF-8").unwrap();
assert_eq!(text_plain_lower, text_plain_upper);
assert_eq!(text_plain_lower.ty(), "Text");
assert_eq!(text_plain_upper.subty(), "Plain");
assert!(text_plain_lower !=
MediaType::parse("text/plain; charset=utf-8").unwrap());
Duplicate Parameter Names
The parser does not report duplicate parameter names as an error, but MediaType
recognizes only the last value.
let text_plain = MediaType::parse(
"text/plain; charset=US-ASCII; charset=UTF-8").unwrap();
assert_eq!(
text_plain.to_string(),
"text/plain; charset=US-ASCII; charset=UTF-8"
);
// Return the last charset value.
assert_eq!(text_plain.get_param(CHARSET), Some(UTF_8));
// Compare the last charset value.
assert_eq!(
text_plain,
MediaType::parse("text/plain; charset=UTF-8").unwrap()
);
Owned Type
MediaTypeBuf
is an owned version of MediaType
.
It is immutable but optimized for minimal stack and heap usage.
use mediatype::{names::*, values::*, MediaType, MediaTypeBuf};
let text_plain: MediaTypeBuf = "text/plain; charset=UTF-8".parse().unwrap();
assert_eq!(text_plain.get_param(CHARSET).unwrap(), UTF_8);
// Convert to MediaType
let mut text_markdown: MediaType = text_plain.to_ref();
text_markdown.subty = MARKDOWN;
assert_eq!(text_markdown.to_string(), "text/markdown; charset=UTF-8");
MediaTypeList
MediaTypeList
parses a comma-separated list of MediaType
s used in the HTTP Accept
header. (RFC 7231)
use mediatype::{MediaType, MediaTypeList};
let mut list = MediaTypeList::new(
"text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8",
);
assert_eq!(list.next(), Some(MediaType::parse("text/html")));
assert_eq!(list.next(), Some(MediaType::parse("application/xhtml+xml")));
assert_eq!(list.next(), Some(MediaType::parse("application/xml;q=0.9")));
assert_eq!(list.next(), Some(MediaType::parse("*/*;q=0.8")));
assert_eq!(list.next(), None);
Serialize and Deserialize
To enable serialization and deserialization, specify serde
feature in Cargo.toml
.
mediatype = { version = "...", features = ["serde"] }
let json = r#"
[
"text/plain",
"image/svg+xml; charset=UTF-8"
]
"#;
let decoded: Vec<MediaType> = serde_json::from_str(json).unwrap();