include/boost/url/grammar/optional_rule.hpp

100.0% Lines (5/5) 100.0% Functions (7/7) -% Branches (0/0)
include/boost/url/grammar/optional_rule.hpp
Line Hits Source Code
1 //
2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
4 //
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)
7 //
8 // Official repository: https://github.com/boostorg/url
9 //
10
11 #ifndef BOOST_URL_GRAMMAR_OPTIONAL_RULE_HPP
12 #define BOOST_URL_GRAMMAR_OPTIONAL_RULE_HPP
13
14 #include <boost/url/detail/config.hpp>
15 #include <boost/url/optional.hpp>
16 #include <boost/url/error_types.hpp>
17 #include <boost/url/grammar/type_traits.hpp>
18 #include <boost/core/empty_value.hpp>
19 #include <boost/core/detail/static_assert.hpp>
20 #include <boost/assert.hpp>
21
22 namespace boost {
23 namespace urls {
24 namespace grammar {
25
26 namespace implementation_defined {
27 template<class Rule>
28 struct optional_rule_t
29 : private empty_value<Rule>
30 {
31 using value_type = boost::optional<
32 typename Rule::value_type>;
33
34 BOOST_URL_CXX14_CONSTEXPR
35 system::result<value_type>
36 parse(
37 char const*& it,
38 char const* end) const;
39
40 constexpr
41 2137 optional_rule_t(
42 Rule const& r) noexcept
43 : empty_value<Rule>(
44 empty_init,
45 2137 r)
46 {
47 2137 }
48 };
49 } // implementation_defined
50
51 /** Match a rule, or the empty string
52
53 Optional BNF elements are denoted with
54 square brackets. If the specified rule
55 returns any error it is treated as if
56 the rule did not match.
57
58 @par Value Type
59 @code
60 using value_type = optional< typename Rule::value_type >;
61 @endcode
62
63 @par Example
64 Rules are used with the function @ref grammar::parse.
65 @code
66 system::result< optional< core::string_view > > rv = parse( "", optional_rule( token_rule( alpha_chars ) ) );
67 @endcode
68
69 @par BNF
70 @code
71 optional = [ rule ]
72 @endcode
73
74 @par Specification
75 @li <a href="https://datatracker.ietf.org/doc/html/rfc5234#section-3.8"
76 >3.8. Optional Sequence (rfc5234)</a>
77
78 @param r The rule to match
79 @return The adapted rule
80
81 @see
82 @ref alpha_chars,
83 @ref parse,
84 @ref optional,
85 @ref token_rule.
86 */
87 template<BOOST_URL_CONSTRAINT(Rule) R>
88 auto
89 constexpr
90 2137 optional_rule(
91 R const& r) ->
92 implementation_defined::optional_rule_t<R>
93 {
94 BOOST_CORE_STATIC_ASSERT(grammar::is_rule<R>::value);
95 2137 return { r };
96 }
97
98 } // grammar
99 } // urls
100 } // boost
101
102 #include <boost/url/grammar/impl/optional_rule.hpp>
103
104 #endif
105