Skip to content

Commit 8be8cf5

Browse files
authored
feat: hasRegExpGroups (#43)
1 parent 783c76b commit 8be8cf5

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

src/component.rs

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub(crate) struct Component<R: RegExp> {
1818
pub regexp: Result<R, Error>,
1919
pub group_name_list: Vec<String>,
2020
pub matcher: Matcher<R>,
21+
pub has_regexp_group: bool,
2122
}
2223

2324
impl<R: RegExp> Component<R> {
@@ -46,6 +47,9 @@ impl<R: RegExp> Component<R> {
4647
regexp,
4748
group_name_list: name_list,
4849
matcher,
50+
has_regexp_group: part_list
51+
.iter()
52+
.any(|part| part.kind == PartType::Regexp),
4953
})
5054
}
5155

src/lib.rs

+29
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,18 @@ impl<R: RegExp> UrlPattern<R> {
378378
&self.hash.pattern_string
379379
}
380380

381+
/// Returns whether the URLPattern contains one or more groups which uses regular expression matching.
382+
pub fn has_regexp_groups(&self) -> bool {
383+
self.protocol.has_regexp_group
384+
|| self.username.has_regexp_group
385+
|| self.password.has_regexp_group
386+
|| self.hostname.has_regexp_group
387+
|| self.port.has_regexp_group
388+
|| self.pathname.has_regexp_group
389+
|| self.search.has_regexp_group
390+
|| self.hash.has_regexp_group
391+
}
392+
381393
// Ref: https://wicg.github.io/urlpattern/#dom-urlpattern-test
382394
/// Test if a given [UrlPatternInput] (with optional base url), matches the
383395
/// pattern.
@@ -833,4 +845,21 @@ mod tests {
833845
})
834846
.unwrap();
835847
}
848+
849+
#[test]
850+
fn has_regexp_group() {
851+
let pattern = <UrlPattern>::parse(UrlPatternInit {
852+
pathname: Some("/:foo.".to_owned()),
853+
..Default::default()
854+
})
855+
.unwrap();
856+
assert!(!pattern.has_regexp_groups());
857+
858+
let pattern = <UrlPattern>::parse(UrlPatternInit {
859+
pathname: Some("/(.*?)".to_owned()),
860+
..Default::default()
861+
})
862+
.unwrap();
863+
assert!(pattern.has_regexp_groups());
864+
}
836865
}

src/quirks.rs

+3
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ pub fn process_construct_pattern_input(
7979
Ok(init)
8080
}
8181
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
82+
#[serde(rename_all = "camelCase")]
8283
pub struct UrlPattern {
8384
pub protocol: UrlPatternComponent,
8485
pub username: UrlPatternComponent,
@@ -88,6 +89,7 @@ pub struct UrlPattern {
8889
pub pathname: UrlPatternComponent,
8990
pub search: UrlPatternComponent,
9091
pub hash: UrlPatternComponent,
92+
pub has_regexp_groups: bool,
9193
}
9294

9395
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
@@ -186,6 +188,7 @@ impl RegExp for EcmaRegexp {
186188
pub fn parse_pattern(init: crate::UrlPatternInit) -> Result<UrlPattern, Error> {
187189
let pattern = crate::UrlPattern::<EcmaRegexp>::parse_internal(init, false)?;
188190
let urlpattern = UrlPattern {
191+
has_regexp_groups: pattern.has_regexp_groups(),
189192
protocol: pattern.protocol.into(),
190193
username: pattern.username.into(),
191194
password: pattern.password.into(),

0 commit comments

Comments
 (0)