Skip to content

Commit c81e82d

Browse files
committed
refactor(pkgid): Pull out spec parsing
1 parent 00604fa commit c81e82d

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

crates/cargo-util-schemas/src/core/package_id_spec.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,8 @@ impl PackageIdSpec {
9494
.into());
9595
}
9696
}
97-
let mut parts = spec.splitn(2, [':', '@']);
98-
let name = parts.next().unwrap();
99-
let version = match parts.next() {
100-
Some(version) => Some(version.parse::<PartialVersion>()?),
101-
None => None,
102-
};
103-
PackageName::new(name)?;
97+
let (name, version) = parse_spec(spec)?.unwrap_or_else(|| (spec.to_owned(), None));
98+
PackageName::new(&name)?;
10499
Ok(PackageIdSpec {
105100
name: String::from(name),
106101
version,
@@ -161,11 +156,8 @@ impl PackageIdSpec {
161156
return Err(ErrorKind::MissingUrlPath(url).into());
162157
};
163158
match frag {
164-
Some(fragment) => match fragment.split_once([':', '@']) {
165-
Some((name, part)) => {
166-
let version = part.parse::<PartialVersion>()?;
167-
(String::from(name), Some(version))
168-
}
159+
Some(fragment) => match parse_spec(&fragment)? {
160+
Some((name, ver)) => (name, ver),
169161
None => {
170162
if fragment.chars().next().unwrap().is_alphabetic() {
171163
(String::from(fragment.as_str()), None)
@@ -217,6 +209,15 @@ impl PackageIdSpec {
217209
}
218210
}
219211

212+
fn parse_spec(spec: &str) -> Result<Option<(String, Option<PartialVersion>)>> {
213+
let Some((name, ver)) = spec.split_once([':', '@']) else {
214+
return Ok(None);
215+
};
216+
let name = name.to_owned();
217+
let ver = ver.parse::<PartialVersion>()?;
218+
Ok(Some((name, Some(ver))))
219+
}
220+
220221
fn strip_url_protocol(url: &Url) -> Url {
221222
// Ridiculous hoop because `Url::set_scheme` errors when changing to http/https
222223
let raw = url.to_string();

0 commit comments

Comments
 (0)