12 #include <unordered_map> 14 #include <fmt/format.h> 15 #include <fmt/ostream.h> 17 #include <restinio/exception.hpp> 18 #include <restinio/utils/percent_encoding.hpp> 19 #include <restinio/optional.hpp> 30 const char * result =
static_cast<
const char * >(
31 std::memchr( from, chr,
static_cast<std::size_t>(to - from) ) );
33 return result ? result : to;
43 class query_string_params_t
final 46 using parameters_container_t = std::vector< std::pair< string_view_t, string_view_t > >;
51 std::unique_ptr<
char[] > data_buffer,
52 parameters_container_t parameters )
60 std::unique_ptr<
char[] > data_buffer,
61 optional_t< string_view_t > tag )
67 query_string_params_t &
operator = ( query_string_params_t && ) =
default;
70 query_string_params_t &
operator = (
const query_string_params_t & ) =
delete;
76 return find_parameter_with_check( key ).second;
81 has( string_view_t key )
const noexcept 83 return m_parameters.end() != find_parameter( key );
91 const auto it = find_parameter( key );
93 return m_parameters.end() != it ?
94 optional_t< string_view_t >{ it->second } :
95 optional_t< string_view_t >{ nullopt };
99 auto size()
const noexcept {
return m_parameters.size(); }
103 bool empty()
const noexcept {
return m_parameters.empty(); }
110 return m_parameters.begin();
116 return m_parameters.end();
132 auto tag()
const noexcept {
return m_tag; }
140 m_parameters.begin(),
143 return key == p.first;
150 auto it = find_parameter( key );
152 if( m_parameters.end() == it )
156 "unable to find parameter \"{}\"",
157 std::string{ key.data(), key.size() } ) };
173 template <
typename Value_Type >
175 get(
const query_string_params_t & params, string_view_t key )
236 inline query_string_params_t
239 string_view_t original_query_string )
277 "invalid format of key-value pairs in query_string: {}, " 278 "no '=' symbol starting from position {}",
auto tag() const noexcept
Get the tag (web beacon) part.
optional_t< string_view_t > get_param(string_view_t key) const noexcept
Get the value of a parameter if it exists.
parameters_container_t::const_iterator find_parameter(string_view_t key) const noexcept
parameters_container_t::const_reference find_parameter_with_check(string_view_t key) const
query_string_params_t & operator=(const query_string_params_t &)=delete
std::unique_ptr< char[] > m_data_buffer
Shared buffer for string_view of named parameterts names.
parameters_container_t m_parameters
query_string_params_t(const query_string_params_t &)=delete
parameters_container_t::const_iterator begin() const noexcept
auto size() const noexcept
Get the size of parameters.
bool empty() const noexcept
Is there any parameters?
query_string_params_t parse_query(string_view_t original_query_string)
Parse query key-value parts.
bool has(string_view_t key) const noexcept
Check parameter.
query_string_params_t(std::unique_ptr< char[] > data_buffer, optional_t< string_view_t > tag)
Constructor for the case when query string contains only tag (web beacon).
const char * modified_memchr(int chr, const char *from, const char *to)
Value_Type get(const query_string_params_t ¶ms, string_view_t key)
Cast query string parameter to a given type.
query_string_params_t(query_string_params_t &&)=default
string_view_t operator[](string_view_t key) const
Get parameter.
query_string_params_t & operator=(query_string_params_t &&)=default
parameters_container_t::const_iterator end() const noexcept
std::enable_if< std::is_same< Parameter_Container, query_string_params_t >::value||std::is_same< Parameter_Container, router::route_params_t >::value, optional_t< Value_Type > >::type opt_value(const Parameter_Container ¶ms, string_view_t key)
Gets the value of a parameter specified by key wrapped in optional_t<Value_Type> if parameter exists ...
optional_t< string_view_t > m_tag
Tag (or web beacon) part.