#[macro_export]
macro_rules! accept {
($request:expr, $($mime:expr => $val:expr),+ $(,)*) => ({
use $crate::input;
use std::iter;
let header = $request.header("Accept").unwrap_or("*/*");
let handled = {
let i = iter::empty();
$(let i = i.chain(iter::once($mime));)+
i
};
let mut preferred = input::priority_header_preferred(header, handled).unwrap_or(0);
let mut outcome = None;
preferred += 1;
$(
if preferred >= 1 {
preferred -= 1;
if preferred == 0 {
outcome = Some($val);
}
}
)+
outcome.unwrap() });
}
#[cfg(test)]
mod tests {
use Request;
#[test]
fn basic() {
let request = Request::fake_http(
"GET",
"/",
vec![("Accept".to_owned(), "text/plain, */*".to_owned())],
vec![],
);
let result = accept!(&request,
"text/plain" => 5,
"*/*" => 12,
);
assert_eq!(result, 5);
}
#[test]
fn wildcard() {
let request = Request::fake_http(
"GET",
"/",
vec![("Accept".to_owned(), "image/gif".to_owned())],
vec![],
);
let result = accept!(&request,
"text/plain" => 5,
"*/*" => 12,
);
assert_eq!(result, 12);
}
#[test]
fn no_match() {
let request = Request::fake_http(
"GET",
"/",
vec![("Accept".to_owned(), "image/gif".to_owned())],
vec![],
);
let result = accept!(&request,
"text/plain" => 5,
"image/svg+xml" => 12,
);
assert_eq!(result, 5);
}
#[test]
fn multimatch_first() {
let request = Request::fake_http(
"GET",
"/",
vec![("Accept".to_owned(), "image/gif".to_owned())],
vec![],
);
let result = accept!(&request,
"text/plain" => 5,
"text/plain" => 12,
"text/plain" => 28,
);
assert_eq!(result, 5);
}
#[test]
fn no_header_first() {
let request = Request::fake_http("GET", "/", vec![], vec![]);
let result = accept!(&request,
"image/gif" => { 5 },
"text/plain" => 12,
"text/html" => 28,
);
assert_eq!(result, 5);
}
#[test]
fn no_header_wildcard() {
let request = Request::fake_http(
"GET",
"/",
vec![("Accept".to_owned(), "image/tiff".to_owned())],
vec![],
);
let result = accept!(&request,
"image/gif" => { 5 },
"text/plain" => 12,
"text/html" => 28,
"*/*" => 37
);
assert_eq!(result, 37);
}
}