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_DETAIL_IMPL_SCHEME_RULE_HPP
11  
#ifndef BOOST_URL_RFC_DETAIL_IMPL_SCHEME_RULE_HPP
12  
#define BOOST_URL_RFC_DETAIL_IMPL_SCHEME_RULE_HPP
12  
#define BOOST_URL_RFC_DETAIL_IMPL_SCHEME_RULE_HPP
13  

13  

14  
#include <boost/url/detail/config.hpp>
14  
#include <boost/url/detail/config.hpp>
15  
#include <boost/url/grammar/alpha_chars.hpp>
15  
#include <boost/url/grammar/alpha_chars.hpp>
16  
#include <boost/url/grammar/charset.hpp>
16  
#include <boost/url/grammar/charset.hpp>
17  
#include <boost/url/grammar/error.hpp>
17  
#include <boost/url/grammar/error.hpp>
18  
#include <boost/url/grammar/lut_chars.hpp>
18  
#include <boost/url/grammar/lut_chars.hpp>
19  
#include <boost/url/grammar/parse.hpp>
19  
#include <boost/url/grammar/parse.hpp>
20  

20  

21  
namespace boost {
21  
namespace boost {
22  
namespace urls {
22  
namespace urls {
23  
namespace detail {
23  
namespace detail {
24  

24  

25  
BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
25  
BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
26  
auto
26  
auto
27  
scheme_rule::
27  
scheme_rule::
28  
parse(
28  
parse(
29  
    char const*& it,
29  
    char const*& it,
30  
    char const* end) const noexcept ->
30  
    char const* end) const noexcept ->
31  
        system::result<value_type>
31  
        system::result<value_type>
32  
{
32  
{
33  
    auto const start = it;
33  
    auto const start = it;
34  
    if(it == end)
34  
    if(it == end)
35  
    {
35  
    {
36  
        // end
36  
        // end
37  
        BOOST_URL_CONSTEXPR_RETURN_EC(
37  
        BOOST_URL_CONSTEXPR_RETURN_EC(
38  
            grammar::error::mismatch);
38  
            grammar::error::mismatch);
39  
    }
39  
    }
40  
    if(! grammar::alpha_chars(*it))
40  
    if(! grammar::alpha_chars(*it))
41  
    {
41  
    {
42  
        // expected alpha
42  
        // expected alpha
43  
        BOOST_URL_CONSTEXPR_RETURN_EC(
43  
        BOOST_URL_CONSTEXPR_RETURN_EC(
44  
            grammar::error::mismatch);
44  
            grammar::error::mismatch);
45  
    }
45  
    }
46  

46  

47  
    constexpr
47  
    constexpr
48  
    grammar::lut_chars scheme_chars(
48  
    grammar::lut_chars scheme_chars(
49  
        "0123456789" "+-."
49  
        "0123456789" "+-."
50  
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
50  
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
51  
        "abcdefghijklmnopqrstuvwxyz");
51  
        "abcdefghijklmnopqrstuvwxyz");
52  
    it = grammar::find_if_not(
52  
    it = grammar::find_if_not(
53  
        it + 1, end, scheme_chars);
53  
        it + 1, end, scheme_chars);
54  
    value_type t;
54  
    value_type t;
55  
    t.scheme = core::string_view(
55  
    t.scheme = core::string_view(
56  
        start, it - start);
56  
        start, it - start);
57  
    t.scheme_id = string_to_scheme(
57  
    t.scheme_id = string_to_scheme(
58  
        t.scheme);
58  
        t.scheme);
59  
    return t;
59  
    return t;
60  
}
60  
}
61  

61  

62  
} // detail
62  
} // detail
63  
} // urls
63  
} // urls
64  
} // boost
64  
} // boost
65  

65  

66  

66  

67  
#endif
67  
#endif