RESTinio
accept-language.hpp
Go to the documentation of this file.
1 /*
2  * RESTinio
3  */
4 
5 /*!
6  * @file
7  * @brief Stuff related to value of Accept-Language HTTP-field.
8  *
9  * @since v.0.6.2
10  */
11 
12 #pragma once
13 
14 #include <restinio/helpers/http_field_parsers/basics.hpp>
15 
16 namespace restinio
17 {
18 
19 namespace http_field_parsers
20 {
21 
23 {
24 
25 namespace ep_impl = restinio::easy_parser::impl;
27 
28 [[nodiscard]]
29 inline auto
31 {
32  return produce<std::string>(
33  repeat(1u, 8u, alpha_symbol_p() >> to_container()),
34  repeat(0u, N,
35  symbol_p('-') >> to_container(),
36  repeat(1u, 8u, alphanum_symbol_p() >> to_container())
37  )
38  );
39 }
40 
41 [[nodiscard]]
42 inline auto
44 {
45  return produce<std::string>(
46  alternatives(
47  symbol_p('*') >> to_container(),
48  make_language_tag_p() >> as_result()
49  )
50  );
51 }
52 
53 } /* namespace accept_language_details */
54 
55 //
56 // accept_language_value_t
57 //
58 /*!
59  * @brief Tools for working with the value of Accept-Language HTTP-field.
60  *
61  * This struct represents parsed value of HTTP-field Accept-Charset
62  * (see https://tools.ietf.org/html/rfc7231#section-5.3.5 and
63  * https://tools.ietf.org/html/rfc4647#section-2.1):
64 @verbatim
65 Accept-Language = 1#( language-range [ weight ] )
66 language-range = (1*8ALPHA *("-" 1*8alphanum)) / "*"
67 alphanum = ALPHA / DIGIT
68 @endverbatim
69  *
70  * @note
71  * Values of `language-range` keep their case during parsing
72  * (it means that they are not converted to lower or upper case).
73  *
74  * @since v.0.6.2
75  */
77 {
78  struct item_t
79  {
82  };
83 
85 
87 
88  /*!
89  * @brief A factory function for a parser of Accept-Language value.
90  *
91  * @since v.0.6.2
92  */
93  [[nodiscard]]
94  static auto
96  {
97  using namespace accept_language_details;
98 
99  return produce< accept_language_value_t >(
100  non_empty_comma_separated_list_p< item_container_t >(
101  produce< item_t >(
102  make_language_range_p() >> &item_t::language_range,
103  maybe( weight_p() >> &item_t::weight )
104  )
105  ) >> &accept_language_value_t::languages
106  );
107  }
108 
109  /*!
110  * @brief An attempt to parse Accept-Language HTTP-field.
111  *
112  * @since v.0.6.2
113  */
114  [[nodiscard]]
117  {
118  return restinio::easy_parser::try_parse( what, make_parser() );
119  }
120 };
121 
122 } /* namespace http_field_parsers */
123 
124 } /* namespace restinio */
expected_t< std::optional< string_view_t >, not_found_t > find_first(const parameter_with_optional_value_container_t &where, string_view_t what)
A helper function to find the first occurence of a parameter with the specified value.
Definition: basics.hpp:1740
std::enable_if< std::is_same< Parameter_Container, query_string_params_t >::value||std::is_same< Parameter_Container, router::route_params_t >::value, std::optional< Value_Type > >::type opt_value(const Parameter_Container &params, string_view_t key)
Gets the value of a parameter specified by key wrapped in std::optional<Value_Type> if parameter exis...
Definition: value_or.hpp:64
Tools for working with the value of Accept-Language HTTP-field.
static auto make_parser()
A factory function for a parser of Accept-Language value.
static expected_t< accept_language_value_t, restinio::easy_parser::parse_error_t > try_parse(string_view_t what)
An attempt to parse Accept-Language HTTP-field.