Skip to content

Commit 4611690

Browse files
Use SmallString on Hashes (#11756)
## Summary We should use this consistently over `Box<str>`.
1 parent d9adba1 commit 4611690

File tree

4 files changed

+88
-89
lines changed

4 files changed

+88
-89
lines changed

crates/uv-extract/src/hash.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,19 @@ impl From<Hasher> for HashDigest {
4141
match hasher {
4242
Hasher::Md5(hasher) => HashDigest {
4343
algorithm: HashAlgorithm::Md5,
44-
digest: format!("{:x}", hasher.finalize()).into_boxed_str(),
44+
digest: format!("{:x}", hasher.finalize()).into(),
4545
},
4646
Hasher::Sha256(hasher) => HashDigest {
4747
algorithm: HashAlgorithm::Sha256,
48-
digest: format!("{:x}", hasher.finalize()).into_boxed_str(),
48+
digest: format!("{:x}", hasher.finalize()).into(),
4949
},
5050
Hasher::Sha384(hasher) => HashDigest {
5151
algorithm: HashAlgorithm::Sha384,
52-
digest: format!("{:x}", hasher.finalize()).into_boxed_str(),
52+
digest: format!("{:x}", hasher.finalize()).into(),
5353
},
5454
Hasher::Sha512(hasher) => HashDigest {
5555
algorithm: HashAlgorithm::Sha512,
56-
digest: format!("{:x}", hasher.finalize()).into_boxed_str(),
56+
digest: format!("{:x}", hasher.finalize()).into(),
5757
},
5858
}
5959
}

crates/uv-publish/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ pub enum PublishError {
6868
HashMismatch {
6969
filename: Box<DistFilename>,
7070
hash_algorithm: HashAlgorithm,
71-
local: Box<str>,
72-
remote: Box<str>,
71+
local: String,
72+
remote: String,
7373
},
7474
#[error("Hash is missing in index for {0}")]
7575
MissingHash(Box<DistFilename>),
@@ -547,8 +547,8 @@ pub async fn check_url(
547547
Err(PublishError::HashMismatch {
548548
filename: Box::new(filename.clone()),
549549
hash_algorithm: remote_hash.algorithm,
550-
local: local_hash.digest,
551-
remote: remote_hash.digest.clone(),
550+
local: local_hash.digest.to_string(),
551+
remote: remote_hash.digest.to_string(),
552552
})
553553
}
554554
} else {

crates/uv-pypi-types/src/simple_json.rs

Lines changed: 55 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,10 @@ impl Default for Yanked {
138138
/// PEP 691 says multiple hashes can be included and the interpretation is left to the client.
139139
#[derive(Debug, Clone, Eq, PartialEq, Default, Deserialize)]
140140
pub struct Hashes {
141-
pub md5: Option<Box<str>>,
142-
pub sha256: Option<Box<str>>,
143-
pub sha384: Option<Box<str>>,
144-
pub sha512: Option<Box<str>>,
141+
pub md5: Option<SmallString>,
142+
pub sha256: Option<SmallString>,
143+
pub sha384: Option<SmallString>,
144+
pub sha512: Option<SmallString>,
145145
}
146146

147147
impl Hashes {
@@ -163,42 +163,30 @@ impl Hashes {
163163
}
164164

165165
match name {
166-
"md5" => {
167-
let md5 = value.to_owned().into_boxed_str();
168-
Ok(Hashes {
169-
md5: Some(md5),
170-
sha256: None,
171-
sha384: None,
172-
sha512: None,
173-
})
174-
}
175-
"sha256" => {
176-
let sha256 = value.to_owned().into_boxed_str();
177-
Ok(Hashes {
178-
md5: None,
179-
sha256: Some(sha256),
180-
sha384: None,
181-
sha512: None,
182-
})
183-
}
184-
"sha384" => {
185-
let sha384 = value.to_owned().into_boxed_str();
186-
Ok(Hashes {
187-
md5: None,
188-
sha256: None,
189-
sha384: Some(sha384),
190-
sha512: None,
191-
})
192-
}
193-
"sha512" => {
194-
let sha512 = value.to_owned().into_boxed_str();
195-
Ok(Hashes {
196-
md5: None,
197-
sha256: None,
198-
sha384: None,
199-
sha512: Some(sha512),
200-
})
201-
}
166+
"md5" => Ok(Hashes {
167+
md5: Some(SmallString::from(value)),
168+
sha256: None,
169+
sha384: None,
170+
sha512: None,
171+
}),
172+
"sha256" => Ok(Hashes {
173+
md5: None,
174+
sha256: Some(SmallString::from(value)),
175+
sha384: None,
176+
sha512: None,
177+
}),
178+
"sha384" => Ok(Hashes {
179+
md5: None,
180+
sha256: None,
181+
sha384: Some(SmallString::from(value)),
182+
sha512: None,
183+
}),
184+
"sha512" => Ok(Hashes {
185+
md5: None,
186+
sha256: None,
187+
sha384: None,
188+
sha512: Some(SmallString::from(value)),
189+
}),
202190
_ => Err(HashError::UnsupportedHashAlgorithm(fragment.to_string())),
203191
}
204192
}
@@ -224,42 +212,30 @@ impl FromStr for Hashes {
224212
}
225213

226214
match name {
227-
"md5" => {
228-
let md5 = value.to_owned().into_boxed_str();
229-
Ok(Hashes {
230-
md5: Some(md5),
231-
sha256: None,
232-
sha384: None,
233-
sha512: None,
234-
})
235-
}
236-
"sha256" => {
237-
let sha256 = value.to_owned().into_boxed_str();
238-
Ok(Hashes {
239-
md5: None,
240-
sha256: Some(sha256),
241-
sha384: None,
242-
sha512: None,
243-
})
244-
}
245-
"sha384" => {
246-
let sha384 = value.to_owned().into_boxed_str();
247-
Ok(Hashes {
248-
md5: None,
249-
sha256: None,
250-
sha384: Some(sha384),
251-
sha512: None,
252-
})
253-
}
254-
"sha512" => {
255-
let sha512 = value.to_owned().into_boxed_str();
256-
Ok(Hashes {
257-
md5: None,
258-
sha256: None,
259-
sha384: None,
260-
sha512: Some(sha512),
261-
})
262-
}
215+
"md5" => Ok(Hashes {
216+
md5: Some(SmallString::from(value)),
217+
sha256: None,
218+
sha384: None,
219+
sha512: None,
220+
}),
221+
"sha256" => Ok(Hashes {
222+
md5: None,
223+
sha256: Some(SmallString::from(value)),
224+
sha384: None,
225+
sha512: None,
226+
}),
227+
"sha384" => Ok(Hashes {
228+
md5: None,
229+
sha256: None,
230+
sha384: Some(SmallString::from(value)),
231+
sha512: None,
232+
}),
233+
"sha512" => Ok(Hashes {
234+
md5: None,
235+
sha256: None,
236+
sha384: None,
237+
sha512: Some(SmallString::from(value)),
238+
}),
263239
_ => Err(HashError::UnsupportedHashAlgorithm(s.to_string())),
264240
}
265241
}
@@ -331,7 +307,7 @@ impl std::fmt::Display for HashAlgorithm {
331307
#[rkyv(derive(Debug))]
332308
pub struct HashDigest {
333309
pub algorithm: HashAlgorithm,
334-
pub digest: Box<str>,
310+
pub digest: SmallString,
335311
}
336312

337313
impl HashDigest {
@@ -367,11 +343,9 @@ impl FromStr for HashDigest {
367343
}
368344

369345
let algorithm = HashAlgorithm::from_str(name)?;
346+
let digest = SmallString::from(value);
370347

371-
Ok(HashDigest {
372-
algorithm,
373-
digest: value.to_owned().into_boxed_str(),
374-
})
348+
Ok(Self { algorithm, digest })
375349
}
376350
}
377351

crates/uv-small-str/src/lib.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,31 @@ impl serde::Serialize for SmallString {
8383
}
8484
}
8585

86+
impl<'de> serde::Deserialize<'de> for SmallString {
87+
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
88+
let s = deserializer.deserialize_str(SmallStringVisitor)?;
89+
Ok(s)
90+
}
91+
}
92+
93+
struct SmallStringVisitor;
94+
95+
impl serde::de::Visitor<'_> for SmallStringVisitor {
96+
type Value = SmallString;
97+
98+
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
99+
f.write_str("a string")
100+
}
101+
102+
fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
103+
Ok(v.into())
104+
}
105+
106+
fn visit_string<E: serde::de::Error>(self, v: String) -> Result<Self::Value, E> {
107+
Ok(v.into())
108+
}
109+
}
110+
86111
/// An [`rkyv`] implementation for [`SmallString`].
87112
impl rkyv::Archive for SmallString {
88113
type Archived = rkyv::string::ArchivedString;

0 commit comments

Comments
 (0)