17#if ADA_INCLUDE_URL_PATTERN
18template <url_pattern_regex::regex_concept regex_prov
ider>
19tl::expected<url_pattern<regex_provider>,
errors> parse_url_pattern_impl(
20 std::variant<std::string_view, url_pattern_init>&& input,
21 const std::string_view* base_url,
const url_pattern_options* options) {
23 url_pattern_init init;
26 if (std::holds_alternative<std::string_view>(input)) {
29 url_pattern_helpers::constructor_string_parser<regex_provider>::parse(
30 std::get<std::string_view>(input));
32 ada_log(
"constructor_string_parser::parse failed");
33 return tl::unexpected(parse_result.error());
35 init = std::move(*parse_result);
38 if (!base_url && !init.protocol) {
39 ada_log(
"base url is null and protocol is not set");
45 init.base_url = std::string(*base_url);
52 ada_log(
"base url is not null");
57 init = std::move(std::get<url_pattern_init>(input));
63 url_pattern_init::process(init, url_pattern_init::process_type::pattern);
64 if (!processed_init) {
65 ada_log(
"url_pattern_init::process failed for init and 'pattern'");
66 return tl::unexpected(processed_init.error());
73 if (!processed_init->protocol) processed_init->protocol =
"*";
74 if (!processed_init->username) processed_init->username =
"*";
75 if (!processed_init->password) processed_init->password =
"*";
76 if (!processed_init->hostname) processed_init->hostname =
"*";
77 if (!processed_init->port) processed_init->port =
"*";
78 if (!processed_init->pathname) processed_init->pathname =
"*";
79 if (!processed_init->search) processed_init->search =
"*";
80 if (!processed_init->hash) processed_init->hash =
"*";
82 ada_log(
"-- processed_init->protocol: ", processed_init->protocol.value());
83 ada_log(
"-- processed_init->username: ", processed_init->username.value());
84 ada_log(
"-- processed_init->password: ", processed_init->password.value());
85 ada_log(
"-- processed_init->hostname: ", processed_init->hostname.value());
86 ada_log(
"-- processed_init->port: ", processed_init->port.value());
87 ada_log(
"-- processed_init->pathname: ", processed_init->pathname.value());
88 ada_log(
"-- processed_init->search: ", processed_init->search.value());
89 ada_log(
"-- processed_init->hash: ", processed_init->hash.value());
95 if (scheme::is_special(*processed_init->protocol)) {
96 std::string_view port = processed_init->port.value();
99 processed_init->port->clear();
104 url_pattern<regex_provider> url_pattern_{};
109 auto protocol_component = url_pattern_component<regex_provider>::compile(
110 processed_init->protocol.value(),
111 url_pattern_helpers::canonicalize_protocol,
112 url_pattern_compile_component_options::DEFAULT);
113 if (!protocol_component) {
114 ada_log(
"url_pattern_component::compile failed for protocol ",
115 processed_init->protocol.value());
116 return tl::unexpected(protocol_component.error());
118 url_pattern_.protocol_component = std::move(*protocol_component);
123 auto username_component = url_pattern_component<regex_provider>::compile(
124 processed_init->username.value(),
125 url_pattern_helpers::canonicalize_username,
126 url_pattern_compile_component_options::DEFAULT);
127 if (!username_component) {
128 ada_log(
"url_pattern_component::compile failed for username ",
129 processed_init->username.value());
130 return tl::unexpected(username_component.error());
132 url_pattern_.username_component = std::move(*username_component);
137 auto password_component = url_pattern_component<regex_provider>::compile(
138 processed_init->password.value(),
139 url_pattern_helpers::canonicalize_password,
140 url_pattern_compile_component_options::DEFAULT);
141 if (!password_component) {
142 ada_log(
"url_pattern_component::compile failed for password ",
143 processed_init->password.value());
144 return tl::unexpected(password_component.error());
146 url_pattern_.password_component = std::move(*password_component);
154 if (url_pattern_helpers::is_ipv6_address(processed_init->hostname.value())) {
155 ada_log(
"processed_init->hostname is ipv6 address");
159 auto hostname_component = url_pattern_component<regex_provider>::compile(
160 processed_init->hostname.value(),
161 url_pattern_helpers::canonicalize_ipv6_hostname,
162 url_pattern_compile_component_options::DEFAULT);
163 if (!hostname_component) {
164 ada_log(
"url_pattern_component::compile failed for ipv6 hostname ",
165 processed_init->hostname.value());
166 return tl::unexpected(hostname_component.error());
168 url_pattern_.hostname_component = std::move(*hostname_component);
173 auto hostname_component = url_pattern_component<regex_provider>::compile(
174 processed_init->hostname.value(),
175 url_pattern_helpers::canonicalize_hostname,
176 url_pattern_compile_component_options::HOSTNAME);
177 if (!hostname_component) {
178 ada_log(
"url_pattern_component::compile failed for hostname ",
179 processed_init->hostname.value());
180 return tl::unexpected(hostname_component.error());
182 url_pattern_.hostname_component = std::move(*hostname_component);
187 auto port_component = url_pattern_component<regex_provider>::compile(
188 processed_init->port.value(), url_pattern_helpers::canonicalize_port,
189 url_pattern_compile_component_options::DEFAULT);
190 if (!port_component) {
191 ada_log(
"url_pattern_component::compile failed for port ",
192 processed_init->port.value());
193 return tl::unexpected(port_component.error());
195 url_pattern_.port_component = std::move(*port_component);
199 auto compile_options = url_pattern_compile_component_options::DEFAULT;
201 compile_options.ignore_case = options->ignore_case;
207 if (url_pattern_helpers::protocol_component_matches_special_scheme<
211 auto path_compile_options = url_pattern_compile_component_options::PATHNAME;
213 path_compile_options.ignore_case = options->ignore_case;
219 auto pathname_component = url_pattern_component<regex_provider>::compile(
220 processed_init->pathname.value(),
221 url_pattern_helpers::canonicalize_pathname, path_compile_options);
222 if (!pathname_component) {
223 ada_log(
"url_pattern_component::compile failed for pathname ",
224 processed_init->pathname.value());
225 return tl::unexpected(pathname_component.error());
227 url_pattern_.pathname_component = std::move(*pathname_component);
232 auto pathname_component = url_pattern_component<regex_provider>::compile(
233 processed_init->pathname.value(),
234 url_pattern_helpers::canonicalize_opaque_pathname, compile_options);
235 if (!pathname_component) {
236 ada_log(
"url_pattern_component::compile failed for opaque pathname ",
237 processed_init->pathname.value());
238 return tl::unexpected(pathname_component.error());
240 url_pattern_.pathname_component = std::move(*pathname_component);
245 auto search_component = url_pattern_component<regex_provider>::compile(
246 processed_init->search.value(), url_pattern_helpers::canonicalize_search,
248 if (!search_component) {
249 ada_log(
"url_pattern_component::compile failed for search ",
250 processed_init->search.value());
251 return tl::unexpected(search_component.error());
253 url_pattern_.search_component = std::move(*search_component);
257 auto hash_component = url_pattern_component<regex_provider>::compile(
258 processed_init->hash.value(), url_pattern_helpers::canonicalize_hash,
260 if (!hash_component) {
261 ada_log(
"url_pattern_component::compile failed for hash ",
262 processed_init->hash.value());
263 return tl::unexpected(hash_component.error());
265 url_pattern_.hash_component = std::move(*hash_component);