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_NOT_EMPTY_RULE_HPP
11  
#ifndef BOOST_URL_GRAMMAR_NOT_EMPTY_RULE_HPP
12  
#define BOOST_URL_GRAMMAR_NOT_EMPTY_RULE_HPP
12  
#define BOOST_URL_GRAMMAR_NOT_EMPTY_RULE_HPP
13  

13  

14  
#include <boost/url/detail/config.hpp>
14  
#include <boost/url/detail/config.hpp>
15  
#include <boost/url/error_types.hpp>
15  
#include <boost/url/error_types.hpp>
16  
#include <boost/url/grammar/type_traits.hpp>
16  
#include <boost/url/grammar/type_traits.hpp>
17  

17  

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

21  

22  
namespace implementation_defined {
22  
namespace implementation_defined {
23  
template<class R>
23  
template<class R>
24  
struct not_empty_rule_t
24  
struct not_empty_rule_t
25  
{
25  
{
26  
    using value_type =
26  
    using value_type =
27  
        typename R::value_type;
27  
        typename R::value_type;
28  

28  

29  
    BOOST_URL_CXX20_CONSTEXPR
29  
    BOOST_URL_CXX20_CONSTEXPR
30  
    auto
30  
    auto
31  
    parse(
31  
    parse(
32  
        char const*& it,
32  
        char const*& it,
33  
        char const* end) const ->
33  
        char const* end) const ->
34  
            system::result<value_type>;
34  
            system::result<value_type>;
35  

35  

36  
    constexpr
36  
    constexpr
37  
    not_empty_rule_t(
37  
    not_empty_rule_t(
38  
        R const& r) noexcept
38  
        R const& r) noexcept
39  
        : r_(r)
39  
        : r_(r)
40  
    {
40  
    {
41  
    }
41  
    }
42  

42  

43  
private:
43  
private:
44  
    R r_;
44  
    R r_;
45  
};
45  
};
46  
} // implementation_defined
46  
} // implementation_defined
47  

47  

48  
/** Match another rule, if the result is not empty
48  
/** Match another rule, if the result is not empty
49  

49  

50  
    This adapts another rule such that
50  
    This adapts another rule such that
51  
    when an empty string is successfully
51  
    when an empty string is successfully
52  
    parsed, the result is an error.
52  
    parsed, the result is an error.
53  

53  

54  
    @par Value Type
54  
    @par Value Type
55  
    @code
55  
    @code
56  
    using value_type = typename Rule::value_type;
56  
    using value_type = typename Rule::value_type;
57  
    @endcode
57  
    @endcode
58  

58  

59  
    @par Example
59  
    @par Example
60  
    Rules are used with the function @ref parse.
60  
    Rules are used with the function @ref parse.
61  
    @code
61  
    @code
62  
    system::result< decode_view > rv = parse( "Program%20Files",
62  
    system::result< decode_view > rv = parse( "Program%20Files",
63  
        not_empty_rule( pct_encoded_rule( unreserved_chars ) ) );
63  
        not_empty_rule( pct_encoded_rule( unreserved_chars ) ) );
64  
    @endcode
64  
    @endcode
65  

65  

66  
    @param r The rule to match
66  
    @param r The rule to match
67  
    @return The adapted rule
67  
    @return The adapted rule
68  

68  

69  
    @see
69  
    @see
70  
        @ref parse,
70  
        @ref parse,
71  
        @ref pct_encoded_rule,
71  
        @ref pct_encoded_rule,
72  
        @ref unreserved_chars.
72  
        @ref unreserved_chars.
73  
*/
73  
*/
74  
template<BOOST_URL_CONSTRAINT(Rule) R>
74  
template<BOOST_URL_CONSTRAINT(Rule) R>
75  
auto
75  
auto
76  
constexpr
76  
constexpr
77  
not_empty_rule(
77  
not_empty_rule(
78  
    R const& r) ->
78  
    R const& r) ->
79  
        implementation_defined::not_empty_rule_t<R>
79  
        implementation_defined::not_empty_rule_t<R>
80  
{
80  
{
81  
    // If you get a compile error here it
81  
    // If you get a compile error here it
82  
    // means that your rule does not meet
82  
    // means that your rule does not meet
83  
    // the type requirements. Please check
83  
    // the type requirements. Please check
84  
    // the documentation.
84  
    // the documentation.
85  
    static_assert(
85  
    static_assert(
86  
        is_rule<R>::value,
86  
        is_rule<R>::value,
87  
        "Rule requirements not met");
87  
        "Rule requirements not met");
88  

88  

89  
    return { r };
89  
    return { r };
90  
}
90  
}
91  

91  

92  
} // grammar
92  
} // grammar
93  
} // urls
93  
} // urls
94  
} // boost
94  
} // boost
95  

95  

96  
#include <boost/url/grammar/impl/not_empty_rule.hpp>
96  
#include <boost/url/grammar/impl/not_empty_rule.hpp>
97  

97  

98  
#endif
98  
#endif