Skip to main content

cookie_agent_config/
wildcard.rs

1/// `*` matches any characters including `/`; `?` matches exactly one character.
2#[must_use]
3pub fn simple_wildcard_match(pattern: &str, resource: &str) -> bool {
4    wildcard_match(pattern, resource)
5        || pattern
6            .strip_suffix(" *")
7            .is_some_and(|prefix| wildcard_match(prefix, resource))
8}
9fn wildcard_match(pattern: &str, resource: &str) -> bool {
10    let pattern = pattern.chars().collect::<Vec<_>>();
11    let resource = resource.chars().collect::<Vec<_>>();
12    let (mut p, mut r, mut star, mut retry) = (0, 0, None, 0);
13    while r < resource.len() {
14        if p < pattern.len() && (pattern[p] == '?' || pattern[p] == resource[r]) {
15            p += 1;
16            r += 1;
17        } else if p < pattern.len() && pattern[p] == '*' {
18            star = Some(p);
19            p += 1;
20            retry = r;
21        } else if let Some(index) = star {
22            p = index + 1;
23            retry += 1;
24            r = retry;
25        } else {
26            return false;
27        }
28    }
29    while p < pattern.len() && pattern[p] == '*' {
30        p += 1;
31    }
32    p == pattern.len()
33}