requiem_http/header/common/accept_language.rs
1use crate::header::{QualityItem, ACCEPT_LANGUAGE};
2use language_tags::LanguageTag;
3
4header! {
5 /// `Accept-Language` header, defined in
6 /// [RFC7231](http://tools.ietf.org/html/rfc7231#section-5.3.5)
7 ///
8 /// The `Accept-Language` header field can be used by user agents to
9 /// indicate the set of natural languages that are preferred in the
10 /// response.
11 ///
12 /// # ABNF
13 ///
14 /// ```text
15 /// Accept-Language = 1#( language-range [ weight ] )
16 /// language-range = <language-range, see [RFC4647], Section 2.1>
17 /// ```
18 ///
19 /// # Example values
20 /// * `da, en-gb;q=0.8, en;q=0.7`
21 /// * `en-us;q=1.0, en;q=0.5, fr`
22 ///
23 /// # Examples
24 ///
25 /// ```rust
26 /// # extern crate requiem_http;
27 /// # extern crate language_tags;
28 /// use requiem_http::Response;
29 /// use requiem_http::http::header::{AcceptLanguage, LanguageTag, qitem};
30 ///
31 /// # fn main() {
32 /// let mut builder = Response::Ok();
33 /// let mut langtag: LanguageTag = Default::default();
34 /// langtag.language = Some("en".to_owned());
35 /// langtag.region = Some("US".to_owned());
36 /// builder.set(
37 /// AcceptLanguage(vec![
38 /// qitem(langtag),
39 /// ])
40 /// );
41 /// # }
42 /// ```
43 ///
44 /// ```rust
45 /// # extern crate requiem_http;
46 /// # #[macro_use] extern crate language_tags;
47 /// use requiem_http::Response;
48 /// use requiem_http::http::header::{AcceptLanguage, QualityItem, q, qitem};
49 /// #
50 /// # fn main() {
51 /// let mut builder = Response::Ok();
52 /// builder.set(
53 /// AcceptLanguage(vec![
54 /// qitem(langtag!(da)),
55 /// QualityItem::new(langtag!(en;;;GB), q(800)),
56 /// QualityItem::new(langtag!(en), q(700)),
57 /// ])
58 /// );
59 /// # }
60 /// ```
61 (AcceptLanguage, ACCEPT_LANGUAGE) => (QualityItem<LanguageTag>)+
62
63 test_accept_language {
64 // From the RFC
65 test_header!(test1, vec![b"da, en-gb;q=0.8, en;q=0.7"]);
66 // Own test
67 test_header!(
68 test2, vec![b"en-US, en; q=0.5, fr"],
69 Some(AcceptLanguage(vec![
70 qitem("en-US".parse().unwrap()),
71 QualityItem::new("en".parse().unwrap(), q(500)),
72 qitem("fr".parse().unwrap()),
73 ])));
74 }
75}