94.59% Lines (35/37) 100.00% Functions (1/1)
TLA Baseline Branch
Line Hits Code Line Hits Code
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_IP_LITERAL_RULE_HPP 11   #ifndef BOOST_URL_RFC_DETAIL_IMPL_IP_LITERAL_RULE_HPP
12   #define BOOST_URL_RFC_DETAIL_IMPL_IP_LITERAL_RULE_HPP 12   #define BOOST_URL_RFC_DETAIL_IMPL_IP_LITERAL_RULE_HPP
13   13  
14   #include <boost/url/detail/config.hpp> 14   #include <boost/url/detail/config.hpp>
15   #include <boost/url/rfc/ipv6_address_rule.hpp> 15   #include <boost/url/rfc/ipv6_address_rule.hpp>
16   #include <boost/url/rfc/detail/ipv6_addrz_rule.hpp> 16   #include <boost/url/rfc/detail/ipv6_addrz_rule.hpp>
17   #include <boost/url/rfc/detail/ipvfuture_rule.hpp> 17   #include <boost/url/rfc/detail/ipvfuture_rule.hpp>
18   #include <boost/url/grammar/delim_rule.hpp> 18   #include <boost/url/grammar/delim_rule.hpp>
19   #include <boost/url/grammar/error.hpp> 19   #include <boost/url/grammar/error.hpp>
20   #include <boost/url/grammar/parse.hpp> 20   #include <boost/url/grammar/parse.hpp>
21   #include <boost/url/grammar/tuple_rule.hpp> 21   #include <boost/url/grammar/tuple_rule.hpp>
22   22  
23   namespace boost { 23   namespace boost {
24   namespace urls { 24   namespace urls {
25   namespace detail { 25   namespace detail {
26   26  
27   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE 27   BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
28   auto 28   auto
HITCBC 29   72 ip_literal_rule_t:: 29   72 ip_literal_rule_t::
30   parse( 30   parse(
31   char const*& it, 31   char const*& it,
32   char const* const end 32   char const* const end
33   ) const noexcept -> 33   ) const noexcept ->
34   system::result<value_type> 34   system::result<value_type>
35   { 35   {
HITCBC 36   72 value_type t; 36   72 value_type t;
37   37  
38   // '[' 38   // '['
39   { 39   {
HITCBC 40   72 auto rv = grammar::parse( 40   72 auto rv = grammar::parse(
HITCBC 41   72 it, end, grammar::delim_rule('[')); 41   72 it, end, grammar::delim_rule('['));
HITCBC 42   72 if(! rv) 42   72 if(! rv)
MISUBC 43   return rv.error(); 43   return rv.error();
44   } 44   }
HITCBC 45   72 if(it == end) 45   72 if(it == end)
46   { 46   {
47   // end 47   // end
HITCBC 48   1 BOOST_URL_CONSTEXPR_RETURN_EC( 48   1 BOOST_URL_CONSTEXPR_RETURN_EC(
49   grammar::error::invalid); 49   grammar::error::invalid);
50   } 50   }
HITCBC 51   71 if(*it != 'v') 51   71 if(*it != 'v')
52   { 52   {
53   // IPv6address 53   // IPv6address
HITCBC 54   66 auto it0 = it; 54   66 auto it0 = it;
HITCBC 55   66 auto rv = grammar::parse( 55   66 auto rv = grammar::parse(
56   it, end, 56   it, end,
HITCBC 57   66 grammar::tuple_rule( 57   66 grammar::tuple_rule(
58   ipv6_address_rule, 58   ipv6_address_rule,
HITCBC 59   66 grammar::squelch( 59   66 grammar::squelch(
HITCBC 60   66 grammar::delim_rule(']')))); 60   66 grammar::delim_rule(']'))));
HITCBC 61   66 if(! rv) 61   66 if(! rv)
62   { 62   {
63   // IPv6addrz: https://datatracker.ietf.org/doc/html/rfc6874 63   // IPv6addrz: https://datatracker.ietf.org/doc/html/rfc6874
HITCBC 64   29 it = it0; 64   29 it = it0;
HITCBC 65   29 auto rv2 = grammar::parse( 65   29 auto rv2 = grammar::parse(
66   it, end, 66   it, end,
HITCBC 67   29 grammar::tuple_rule( 67   29 grammar::tuple_rule(
68   ipv6_addrz_rule, 68   ipv6_addrz_rule,
HITCBC 69   29 grammar::squelch( 69   29 grammar::squelch(
HITCBC 70   29 grammar::delim_rule(']')))); 70   29 grammar::delim_rule(']'))));
HITCBC 71   29 if(! rv2) 71   29 if(! rv2)
HITCBC 72   24 return rv2.error(); 72   24 return rv2.error();
HITCBC 73   5 t.ipv6 = rv2->ipv6; 73   5 t.ipv6 = rv2->ipv6;
HITCBC 74   5 t.is_ipv6 = true; 74   5 t.is_ipv6 = true;
HITCBC 75   5 return t; 75   5 return t;
76   } 76   }
HITCBC 77   37 t.ipv6 = *rv; 77   37 t.ipv6 = *rv;
HITCBC 78   37 t.is_ipv6 = true; 78   37 t.is_ipv6 = true;
HITCBC 79   37 return t; 79   37 return t;
80   } 80   }
81   { 81   {
82   // IPvFuture 82   // IPvFuture
HITCBC 83   5 auto rv = grammar::parse( 83   5 auto rv = grammar::parse(
84   it, end, 84   it, end,
HITCBC 85   5 grammar::tuple_rule( 85   5 grammar::tuple_rule(
86   ipvfuture_rule, 86   ipvfuture_rule,
HITCBC 87   5 grammar::squelch( 87   5 grammar::squelch(
HITCBC 88   5 grammar::delim_rule(']')))); 88   5 grammar::delim_rule(']'))));
HITCBC 89   5 if(! rv) 89   5 if(! rv)
MISUBC 90   return rv.error(); 90   return rv.error();
HITCBC 91   5 t.is_ipv6 = false; 91   5 t.is_ipv6 = false;
HITCBC 92   5 t.ipvfuture = rv->str; 92   5 t.ipvfuture = rv->str;
HITCBC 93   5 return t; 93   5 return t;
94   } 94   }
95   } 95   }
96   96  
97   } // detail 97   } // detail
98   } // urls 98   } // urls
99   } // boost 99   } // boost
100   100  
101   101  
102   #endif 102   #endif