5#ifndef ADA_URL_PATTERN_INL_H
6#define ADA_URL_PATTERN_INL_H
16#if ADA_INCLUDE_URL_PATTERN
26inline bool url_pattern_component_result::operator==(
31template <url_pattern_regex::regex_concept regex_prov
ider>
33url_pattern_component<regex_provider>::create_component_match_result(
35 std::vector<std::optional<std::string>>&&
exec_result) {
48 result.groups.reserve(size);
49 for (
size_t index = 0; index < size; index++) {
56template <url_pattern_regex::regex_concept regex_prov
ider>
57std::string_view url_pattern<regex_provider>::get_protocol()
const
62template <url_pattern_regex::regex_concept regex_prov
ider>
63std::string_view url_pattern<regex_provider>::get_username()
const
68template <url_pattern_regex::regex_concept regex_prov
ider>
69std::string_view url_pattern<regex_provider>::get_password()
const
74template <url_pattern_regex::regex_concept regex_prov
ider>
75std::string_view url_pattern<regex_provider>::get_hostname()
const
80template <url_pattern_regex::regex_concept regex_prov
ider>
81std::string_view url_pattern<regex_provider>::get_port()
const
86template <url_pattern_regex::regex_concept regex_prov
ider>
87std::string_view url_pattern<regex_provider>::get_pathname()
const
92template <url_pattern_regex::regex_concept regex_prov
ider>
93std::string_view url_pattern<regex_provider>::get_search()
const
98template <url_pattern_regex::regex_concept regex_prov
ider>
99std::string_view url_pattern<regex_provider>::get_hash()
const
104template <url_pattern_regex::regex_concept regex_prov
ider>
105bool url_pattern<regex_provider>::ignore_case()
const {
108template <url_pattern_regex::regex_concept regex_prov
ider>
109bool url_pattern<regex_provider>::has_regexp_groups()
const {
121 return type == url_pattern_part_type::REGEXP;
124inline std::string_view url_pattern_compile_component_options::get_delimiter()
132inline std::string_view url_pattern_compile_component_options::get_prefix()
135 return {&
prefix.value(), 1};
140template <url_pattern_regex::regex_concept regex_prov
ider>
141template <url_pattern_encoding_callback F>
142tl::expected<url_pattern_component<regex_provider>,
errors>
143url_pattern_component<regex_provider>::compile(
146 ada_log(
"url_pattern_component::compile input: ",
input);
153 ada_log(
"parse_pattern_string failed");
154 return tl::unexpected(
part_list.error());
162 url_pattern_component_type::REGEXP;
168 const auto&
part = (*part_list)[0];
169 if (
part.type == url_pattern_part_type::FIXED_TEXT &&
170 part.modifier == url_pattern_part_modifier::none &&
174 }
else if (
part.type == url_pattern_part_type::FULL_WILDCARD &&
175 part.modifier == url_pattern_part_modifier::none &&
176 part.prefix.empty() &&
part.suffix.empty()) {
188 if (
component_type == url_pattern_component_type::FULL_WILDCARD &&
200 url_pattern_helpers::generate_regular_expression_and_name_list(*
part_list,
218template <url_pattern_regex::regex_concept regex_prov
ider>
219bool url_pattern_component<regex_provider>::fast_test(
220 std::string_view
input)
const noexcept {
223 if (type == url_pattern_component_type::FULL_WILDCARD) {
226 if (type == url_pattern_component_type::EXACT_MATCH) {
229 if (type == url_pattern_component_type::EMPTY) {
230 return input.empty();
236template <url_pattern_regex::regex_concept regex_prov
ider>
237std::optional<std::vector<std::optional<std::string>>>
238url_pattern_component<regex_provider>::fast_match(
239 std::string_view
input)
const {
241 if (type == url_pattern_component_type::FULL_WILDCARD) {
245 return std::vector<std::optional<std::string>>{};
248 return std::vector<std::optional<std::string>>{std::string(
input)};
250 if (type == url_pattern_component_type::EXACT_MATCH) {
252 return std::vector<std::optional<std::string>>{};
256 if (type == url_pattern_component_type::EMPTY) {
258 return std::vector<std::optional<std::string>>{};
263 return regex_provider::regex_search(
input,
regexp);
266template <url_pattern_regex::regex_concept regex_prov
ider>
274template <url_pattern_regex::regex_concept regex_prov
ider>
275bool url_pattern<regex_provider>::test_components(
276 std::string_view
protocol, std::string_view username,
277 std::string_view password, std::string_view
hostname, std::string_view port,
279 std::string_view hash)
const {
289template <url_pattern_regex::regex_concept regex_prov
ider>
293 if (std::holds_alternative<url_pattern_init>(
input)) {
302 std::get<url_pattern_init>(
input), url_pattern_init::process_type::url,
353 url->get_password(), url->get_hostname(),
358template <url_pattern_regex::regex_concept regex_prov
ider>
362 std::string username{};
363 std::string password{};
375 if (std::holds_alternative<url_pattern_init>(
input)) {
377 "url_pattern::match called with url_pattern_init and base_url_string=",
381 ada_log(
"failed to match because base_url_string was given");
389 std::get<url_pattern_init>(
input), url_pattern_init::process_type::url,
394 ada_log(
"match returned std::nullopt because process threw");
447 ada_log(
"match returned std::nullopt because failed to parse base_url=",
465 ada_log(
"match returned std::nullopt because url failed");
473 protocol = url->get_protocol().substr(0, url->get_protocol().size() - 1);
475 username = url->get_username();
477 password = url->get_password();
483 port = url->get_port();
490 if (url->has_search()) {
491 auto view = url->get_search();
492 search =
view.starts_with(
"?") ? url->get_search().substr(1) :
view;
498 if (url->has_hash()) {
499 auto view = url->get_hash();
500 hash =
view.starts_with(
"#") ? url->get_hash().substr(1) :
view;
Cross-platform compiler macros and common definitions.
#define ADA_ASSERT_TRUE(COND)
#define ada_lifetime_bound
type
Enumeration of URL scheme types.
errors
Error codes for URL parsing operations.
tl::expected< result_type, ada::errors > result
template ada::result< url_aggregator > parse< url_aggregator >(std::string_view input, const url_aggregator *base_url)
ada_warn_unused ada::result< result_type > parse(std::string_view input, const result_type *base_url=nullptr)
URLPattern API implementation.
Declaration for the URLPattern helpers.