19#if ADA_INCLUDE_URL_PATTERN
20template <url_pattern_regex::regex_concept regex_prov
ider>
21tl::expected<url_pattern<regex_provider>,
errors> parse_url_pattern_impl(
22 std::variant<std::string_view, url_pattern_init>&& input,
28 if (std::holds_alternative<std::string_view>(input)) {
32 std::get<std::string_view>(input));
34 ada_log(
"constructor_string_parser::parse failed");
35 return tl::unexpected(parse_result.error());
37 init = std::move(*parse_result);
41 ada_log(
"base url is null and protocol is not set");
47 init.
base_url = std::string(*base_url);
54 ada_log(
"base url is not null");
59 init = std::move(std::get<url_pattern_init>(input));
66 if (!processed_init) {
67 ada_log(
"url_pattern_init::process failed for init and 'pattern'");
68 return tl::unexpected(processed_init.error());
75 if (!processed_init->protocol) processed_init->protocol =
"*";
76 if (!processed_init->username) processed_init->username =
"*";
77 if (!processed_init->password) processed_init->password =
"*";
78 if (!processed_init->hostname) processed_init->hostname =
"*";
79 if (!processed_init->port) processed_init->port =
"*";
80 if (!processed_init->pathname) processed_init->pathname =
"*";
81 if (!processed_init->search) processed_init->search =
"*";
82 if (!processed_init->hash) processed_init->hash =
"*";
84 ada_log(
"-- processed_init->protocol: ", processed_init->protocol.value());
85 ada_log(
"-- processed_init->username: ", processed_init->username.value());
86 ada_log(
"-- processed_init->password: ", processed_init->password.value());
87 ada_log(
"-- processed_init->hostname: ", processed_init->hostname.value());
88 ada_log(
"-- processed_init->port: ", processed_init->port.value());
89 ada_log(
"-- processed_init->pathname: ", processed_init->pathname.value());
90 ada_log(
"-- processed_init->search: ", processed_init->search.value());
91 ada_log(
"-- processed_init->hash: ", processed_init->hash.value());
97 if (scheme::is_special(*processed_init->protocol)) {
98 std::string_view port = processed_init->port.value();
99 helpers::trim_c0_whitespace(port);
102 processed_init->port->clear();
113 processed_init->protocol.value(),
116 if (!protocol_component) {
117 ada_log(
"url_pattern_component::compile failed for protocol ",
118 processed_init->protocol.value());
119 return tl::unexpected(protocol_component.error());
121 url_pattern_.protocol_component = std::move(*protocol_component);
127 processed_init->username.value(),
130 if (!username_component) {
131 ada_log(
"url_pattern_component::compile failed for username ",
132 processed_init->username.value());
133 return tl::unexpected(username_component.error());
135 url_pattern_.username_component = std::move(*username_component);
141 processed_init->password.value(),
144 if (!password_component) {
145 ada_log(
"url_pattern_component::compile failed for password ",
146 processed_init->password.value());
147 return tl::unexpected(password_component.error());
149 url_pattern_.password_component = std::move(*password_component);
158 ada_log(
"processed_init->hostname is ipv6 address");
163 processed_init->hostname.value(),
166 if (!hostname_component) {
167 ada_log(
"url_pattern_component::compile failed for ipv6 hostname ",
168 processed_init->hostname.value());
169 return tl::unexpected(hostname_component.error());
171 url_pattern_.hostname_component = std::move(*hostname_component);
177 processed_init->hostname.value(),
180 if (!hostname_component) {
181 ada_log(
"url_pattern_component::compile failed for hostname ",
182 processed_init->hostname.value());
183 return tl::unexpected(hostname_component.error());
185 url_pattern_.hostname_component = std::move(*hostname_component);
193 if (!port_component) {
194 ada_log(
"url_pattern_component::compile failed for port ",
195 processed_init->port.value());
196 return tl::unexpected(port_component.error());
198 url_pattern_.port_component = std::move(*port_component);
204 compile_options.ignore_case = options->
ignore_case;
216 path_compile_options.ignore_case = options->
ignore_case;
223 processed_init->pathname.value(),
225 if (!pathname_component) {
226 ada_log(
"url_pattern_component::compile failed for pathname ",
227 processed_init->pathname.value());
228 return tl::unexpected(pathname_component.error());
230 url_pattern_.pathname_component = std::move(*pathname_component);
236 processed_init->pathname.value(),
238 if (!pathname_component) {
239 ada_log(
"url_pattern_component::compile failed for opaque pathname ",
240 processed_init->pathname.value());
241 return tl::unexpected(pathname_component.error());
243 url_pattern_.pathname_component = std::move(*pathname_component);
251 if (!search_component) {
252 ada_log(
"url_pattern_component::compile failed for search ",
253 processed_init->search.value());
254 return tl::unexpected(search_component.error());
256 url_pattern_.search_component = std::move(*search_component);
263 if (!hash_component) {
264 ada_log(
"url_pattern_component::compile failed for hash ",
265 processed_init->hash.value());
266 return tl::unexpected(hash_component.error());
268 url_pattern_.hash_component = std::move(*hash_component);
static tl::expected< url_pattern_init, errors > process(const url_pattern_init &init, process_type type, std::optional< std::string_view > protocol=std::nullopt, std::optional< std::string_view > username=std::nullopt, std::optional< std::string_view > password=std::nullopt, std::optional< std::string_view > hostname=std::nullopt, std::optional< std::string_view > port=std::nullopt, std::optional< std::string_view > pathname=std::nullopt, std::optional< std::string_view > search=std::nullopt, std::optional< std::string_view > hash=std::nullopt)