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

10  

11  
#ifndef BOOST_URL_GRAMMAR_IMPL_PARSE_HPP
11  
#ifndef BOOST_URL_GRAMMAR_IMPL_PARSE_HPP
12  
#define BOOST_URL_GRAMMAR_IMPL_PARSE_HPP
12  
#define BOOST_URL_GRAMMAR_IMPL_PARSE_HPP
13  

13  

14  
#include <boost/url/grammar/error.hpp>
14  
#include <boost/url/grammar/error.hpp>
15  
#include <boost/url/grammar/type_traits.hpp>
15  
#include <boost/url/grammar/type_traits.hpp>
16  

16  

17  
namespace boost {
17  
namespace boost {
18  
namespace urls {
18  
namespace urls {
19  
namespace grammar {
19  
namespace grammar {
20  

20  

21  
template<BOOST_URL_CONSTRAINT(Rule) R>
21  
template<BOOST_URL_CONSTRAINT(Rule) R>
22  
BOOST_URL_CXX14_CONSTEXPR
22  
BOOST_URL_CXX14_CONSTEXPR
23  
auto
23  
auto
24  
parse(
24  
parse(
25  
    char const*& it,
25  
    char const*& it,
26  
    char const* end,
26  
    char const* end,
27  
    R const& r) ->
27  
    R const& r) ->
28  
        system::result<typename R::value_type>
28  
        system::result<typename R::value_type>
29  
{
29  
{
30  
    // If this goes off, it means the rule
30  
    // If this goes off, it means the rule
31  
    // passed in did not meet the requirements.
31  
    // passed in did not meet the requirements.
32  
    // Please check the documentation.
32  
    // Please check the documentation.
33  
    static_assert(
33  
    static_assert(
34  
        is_rule<R>::value,
34  
        is_rule<R>::value,
35  
        "Rule requirements not met");
35  
        "Rule requirements not met");
36  

36  

37  
    return r.parse(it, end);
37  
    return r.parse(it, end);
38  
}
38  
}
39  

39  

40  
template<BOOST_URL_CONSTRAINT(Rule) R>
40  
template<BOOST_URL_CONSTRAINT(Rule) R>
41  
BOOST_URL_CXX14_CONSTEXPR
41  
BOOST_URL_CXX14_CONSTEXPR
42  
auto
42  
auto
43  
parse(
43  
parse(
44  
    core::string_view s,
44  
    core::string_view s,
45  
    R const& r) ->
45  
    R const& r) ->
46  
        system::result<typename R::value_type>
46  
        system::result<typename R::value_type>
47  
{
47  
{
48  
    // If this goes off, it means the rule
48  
    // If this goes off, it means the rule
49  
    // passed in did not meet the requirements.
49  
    // passed in did not meet the requirements.
50  
    // Please check the documentation.
50  
    // Please check the documentation.
51  
    static_assert(
51  
    static_assert(
52  
        is_rule<R>::value,
52  
        is_rule<R>::value,
53  
        "Rule requirements not met");
53  
        "Rule requirements not met");
54  

54  

55  
    auto it = s.data();
55  
    auto it = s.data();
56  
    auto const end = it + s.size();
56  
    auto const end = it + s.size();
57  
    auto rv = r.parse(it, end);
57  
    auto rv = r.parse(it, end);
58  
    if( rv &&
58  
    if( rv &&
59  
        it != end)
59  
        it != end)
60  
        return error::leftover;
60  
        return error::leftover;
61  
    return rv;
61  
    return rv;
62  
}
62  
}
63  

63  

64  
} // grammar
64  
} // grammar
65  
} // urls
65  
} // urls
66  
} // boost
66  
} // boost
67  

67  

68  
#endif
68  
#endif