1 -
//
 
2 -
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
 
3 -
//
 
4 -
// Distributed under the Boost Software License, Version 1.0. (See accompanying
 
5 -
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
6 -
//
 
7 -
// Official repository: https://github.com/boostorg/url
 
8 -
//
 
9 -

 
10 -
#ifndef BOOST_URL_RFC_DETAIL_QUERY_PART_RULE_HPP
 
11 -
#define BOOST_URL_RFC_DETAIL_QUERY_PART_RULE_HPP
 
12 -

 
13 -
#include "boost/url/detail/config.hpp"
 
14 -
#include "boost/url/error_types.hpp"
 
15 -
#include "boost/url/pct_string_view.hpp"
 
16 -
#include "boost/url/rfc/query_rule.hpp"
 
17 -
#include "boost/url/grammar/parse.hpp"
 
18 -
#include <cstdlib>
 
19 -

 
20 -
namespace boost {
 
21 -
namespace urls {
 
22 -
namespace detail {
 
23 -

 
24 -
/** Rule for query-part
 
25 -

 
26 -
    @par BNF
 
27 -
    @code
 
28 -
    query-part    = [ "?" query ]
 
29 -
    @endcode
 
30 -
*/
 
31 -
struct query_part_rule_t
 
32 -
{
 
33 -
    struct value_type
 
34 -
    {
 
35 -
        pct_string_view query;
 
36 -
        std::size_t count = 0;
 
37 -
        bool has_query = false;
 
38 -
    };
 
39 -

 
40 -
    auto
 
41 -
    parse(
 
42 -
        char const*& it,
 
43 -
        char const* end
 
44 -
            ) const noexcept ->
 
45 -
        system::result<value_type>
 
46 -
    {
 
47 -
        if( it == end ||
 
48 -
            *it != '?')
 
49 -
            return {};
 
50 -
        ++it;
 
51 -
        auto rv = grammar::parse(
 
52 -
            it, end, query_rule);
 
53 -
        // query_rule is optionally empty and must not fail
 
54 -
        BOOST_ASSERT( rv );
 
55 -
        value_type t;
 
56 -
        t.query = rv->buffer();
 
57 -
        t.count = rv->size();
 
58 -
        // a query_rule represents at least one parameter:
 
59 -
        // <empty key, no value>
 
60 -
        BOOST_ASSERT( t.count );
 
61 -
        t.has_query = true;
 
62 -
        return t;
 
63 -
    }
 
64 -
};
 
65 -

 
66 -
constexpr query_part_rule_t query_part_rule{};
 
67 -

 
68 -
} // detail
 
69 -
} // urls
 
70 -
} // boost
 
71 -

 
72 -
#endif