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) 2023 Alan de Freitas (alandefreitas@gmail.com)
3  
// Copyright (c) 2023 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_RFC_IMPL_URI_RULE_HPP
11  
#ifndef BOOST_URL_RFC_IMPL_URI_RULE_HPP
12  
#define BOOST_URL_RFC_IMPL_URI_RULE_HPP
12  
#define BOOST_URL_RFC_IMPL_URI_RULE_HPP
13  

13  

14  
#include <boost/url/detail/config.hpp>
14  
#include <boost/url/detail/config.hpp>
15  
#include <boost/url/url_view.hpp>
15  
#include <boost/url/url_view.hpp>
16  
#include <boost/url/grammar/delim_rule.hpp>
16  
#include <boost/url/grammar/delim_rule.hpp>
17  
#include <boost/url/grammar/tuple_rule.hpp>
17  
#include <boost/url/grammar/tuple_rule.hpp>
18  
#include <boost/url/grammar/optional_rule.hpp>
18  
#include <boost/url/grammar/optional_rule.hpp>
19  
#include <boost/url/grammar/parse.hpp>
19  
#include <boost/url/grammar/parse.hpp>
20  
#include <boost/url/rfc/detail/fragment_part_rule.hpp>
20  
#include <boost/url/rfc/detail/fragment_part_rule.hpp>
21  
#include <boost/url/rfc/detail/hier_part_rule.hpp>
21  
#include <boost/url/rfc/detail/hier_part_rule.hpp>
22  
#include <boost/url/rfc/detail/query_part_rule.hpp>
22  
#include <boost/url/rfc/detail/query_part_rule.hpp>
23  
#include <boost/url/rfc/detail/scheme_rule.hpp>
23  
#include <boost/url/rfc/detail/scheme_rule.hpp>
24  

24  

25  
namespace boost {
25  
namespace boost {
26  
namespace urls {
26  
namespace urls {
27  

27  

28  
BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
28  
BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
29  
auto
29  
auto
30  
implementation_defined::uri_rule_t::
30  
implementation_defined::uri_rule_t::
31  
parse(
31  
parse(
32  
    char const*& it,
32  
    char const*& it,
33  
    char const* const end
33  
    char const* const end
34  
        ) const noexcept ->
34  
        ) const noexcept ->
35  
    system::result<value_type>
35  
    system::result<value_type>
36  
{
36  
{
37  
    detail::url_impl u(detail::url_impl::from::string);
37  
    detail::url_impl u(detail::url_impl::from::string);
38  
    u.cs_ = it;
38  
    u.cs_ = it;
39  

39  

40  
    // scheme
40  
    // scheme
41  
    {
41  
    {
42  
        auto rv = grammar::parse(
42  
        auto rv = grammar::parse(
43  
            it, end,
43  
            it, end,
44  
            grammar::tuple_rule(
44  
            grammar::tuple_rule(
45  
                detail::scheme_rule(),
45  
                detail::scheme_rule(),
46  
                grammar::squelch(
46  
                grammar::squelch(
47  
                    grammar::delim_rule(':'))));
47  
                    grammar::delim_rule(':'))));
48  
        if(! rv)
48  
        if(! rv)
49  
            return rv.error();
49  
            return rv.error();
50  
        u.apply_scheme(rv->scheme);
50  
        u.apply_scheme(rv->scheme);
51  
    }
51  
    }
52  

52  

53  
    // hier_part
53  
    // hier_part
54  
    {
54  
    {
55  
        auto rv = grammar::parse(
55  
        auto rv = grammar::parse(
56  
            it, end,
56  
            it, end,
57  
            detail::hier_part_rule);
57  
            detail::hier_part_rule);
58  
        if(! rv)
58  
        if(! rv)
59  
            return rv.error();
59  
            return rv.error();
60  
        if(rv->has_authority)
60  
        if(rv->has_authority)
61  
            u.apply_authority(rv->authority.u_);
61  
            u.apply_authority(rv->authority.u_);
62  
        u.apply_path(
62  
        u.apply_path(
63  
            rv->path,
63  
            rv->path,
64  
            rv->segment_count);
64  
            rv->segment_count);
65  
    }
65  
    }
66  

66  

67  
    // [ "?" query ]
67  
    // [ "?" query ]
68  
    {
68  
    {
69  
        auto rv = grammar::parse(
69  
        auto rv = grammar::parse(
70  
            it, end, detail::query_part_rule);
70  
            it, end, detail::query_part_rule);
71  
        if(! rv)
71  
        if(! rv)
72  
            return rv.error();
72  
            return rv.error();
73  
        if(rv->has_query)
73  
        if(rv->has_query)
74  
        {
74  
        {
75  
            // map "?" to { {} }
75  
            // map "?" to { {} }
76  
            u.apply_query(
76  
            u.apply_query(
77  
                rv->query,
77  
                rv->query,
78  
                rv->count);
78  
                rv->count);
79  
        }
79  
        }
80  
    }
80  
    }
81  

81  

82  
    // [ "#" fragment ]
82  
    // [ "#" fragment ]
83  
    {
83  
    {
84  
        auto rv = grammar::parse(
84  
        auto rv = grammar::parse(
85  
            it, end, detail::fragment_part_rule);
85  
            it, end, detail::fragment_part_rule);
86  
        if(! rv)
86  
        if(! rv)
87  
            return rv.error();
87  
            return rv.error();
88  
        if(rv->has_fragment)
88  
        if(rv->has_fragment)
89  
            u.apply_frag(rv->fragment);
89  
            u.apply_frag(rv->fragment);
90  
    }
90  
    }
91  

91  

92  
    return url_view(u);
92  
    return url_view(u);
93  
}
93  
}
94  

94  

95  
} // urls
95  
} // urls
96  
} // boost
96  
} // boost
97  

97  

98  

98  

99  
#endif
99  
#endif