Skip to content

Commit b27f203

Browse files
committed
Auto merge of #12785 - epage:version-refactor, r=weihanglo
refactor(core): Clean up deserialization of PackageId This came as part of another change that I'm abandoning but I felt this made things cleaner, so I decided to keep it.
2 parents b48c41a + 3f879a0 commit b27f203

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

src/cargo/core/package_id.rs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -82,27 +82,31 @@ impl<'de> de::Deserialize<'de> for PackageId {
8282
D: de::Deserializer<'de>,
8383
{
8484
let string = String::deserialize(d)?;
85-
let mut s = string.splitn(3, ' ');
86-
let name = s.next().unwrap();
87-
let name = InternedString::new(name);
88-
let Some(version) = s.next() else {
89-
return Err(de::Error::custom("invalid serialized PackageId"));
90-
};
91-
let version = version.to_semver().map_err(de::Error::custom)?;
92-
let Some(url) = s.next() else {
93-
return Err(de::Error::custom("invalid serialized PackageId"));
94-
};
95-
let url = if url.starts_with('(') && url.ends_with(')') {
96-
&url[1..url.len() - 1]
97-
} else {
98-
return Err(de::Error::custom("invalid serialized PackageId"));
99-
};
85+
86+
let (field, rest) = string
87+
.split_once(' ')
88+
.ok_or_else(|| de::Error::custom("invalid serialized PackageId"))?;
89+
let name = InternedString::new(field);
90+
91+
let (field, rest) = rest
92+
.split_once(' ')
93+
.ok_or_else(|| de::Error::custom("invalid serialized PackageId"))?;
94+
let version = field.to_semver().map_err(de::Error::custom)?;
95+
96+
let url =
97+
strip_parens(rest).ok_or_else(|| de::Error::custom("invalid serialized PackageId"))?;
10098
let source_id = SourceId::from_url(url).map_err(de::Error::custom)?;
10199

102100
Ok(PackageId::pure(name, version, source_id))
103101
}
104102
}
105103

104+
fn strip_parens(value: &str) -> Option<&str> {
105+
let value = value.strip_prefix('(')?;
106+
let value = value.strip_suffix(')')?;
107+
Some(value)
108+
}
109+
106110
impl PartialEq for PackageId {
107111
fn eq(&self, other: &PackageId) -> bool {
108112
if ptr::eq(self.inner, other.inner) {

0 commit comments

Comments
 (0)