MCPcopy Create free account
hub / github.com/denoland/rust-urlpattern / parse_constructor_string

Function parse_constructor_string

src/constructor_parser.rs:296–454  ·  view source on GitHub ↗

Ref: https://wicg.github.io/urlpattern/#parse-a-constructor-string

(
  input: &str,
)

Source from the content-addressed store, hash-verified

294
295// Ref: https://wicg.github.io/urlpattern/#parse-a-constructor-string
296pub(crate) fn parse_constructor_string<R: RegExp>(
297 input: &str,
298) -> Result<UrlPatternInit, Error> {
299 let token_list = crate::tokenizer::tokenize(
300 input,
301 crate::tokenizer::TokenizePolicy::Lenient,
302 )?;
303
304 let mut parser = ConstructorStringParser {
305 input,
306 token_list,
307 result: UrlPatternInit {
308 protocol: None,
309 username: None,
310 password: None,
311 hostname: None,
312 port: None,
313 pathname: None,
314 search: None,
315 hash: None,
316 base_url: None,
317 },
318 component_start: 0,
319 token_index: 0,
320 token_increment: 1,
321 group_depth: 0,
322 hostname_ipv6_bracket_depth: 0,
323 protocol_matches_special_scheme: false,
324 state: ConstructorStringParserState::Init,
325 };
326
327 while parser.token_index < parser.token_list.len() {
328 parser.token_increment = 1;
329 if parser.token_list[parser.token_index].kind == TokenType::End {
330 if parser.state == ConstructorStringParserState::Init {
331 parser.rewind();
332 if parser.is_hash_prefix() {
333 parser.change_state(ConstructorStringParserState::Hash, 1);
334 } else if parser.is_search_prefix() {
335 parser.change_state(ConstructorStringParserState::Search, 1);
336 } else {
337 parser.change_state(ConstructorStringParserState::Pathname, 0);
338 }
339 parser.token_index += parser.token_increment;
340 continue;
341 }
342 if parser.state == ConstructorStringParserState::Authority {
343 parser.rewind_and_set_state(ConstructorStringParserState::Hostname);
344 parser.token_index += parser.token_increment;
345 continue;
346 }
347 parser.change_state(ConstructorStringParserState::Done, 0);
348 break;
349 }
350 if parser.is_group_open() {
351 parser.group_depth += 1;
352 parser.token_index += parser.token_increment;
353 continue;

Callers

nothing calls this directly

Calls 15

tokenizeFunction · 0.85
rewindMethod · 0.80
is_hash_prefixMethod · 0.80
change_stateMethod · 0.80
is_search_prefixMethod · 0.80
rewind_and_set_stateMethod · 0.80
is_group_openMethod · 0.80
is_group_closeMethod · 0.80
is_protocol_suffixMethod · 0.80
is_pathname_startMethod · 0.80

Tested by

no test coverage detected