Skip to content

Commit f491da4

Browse files
ref(chunks): Make get_sha1_checksums infallible
Refactor `get_sha1_checksums` to be infallible by using `NonZeroUsize` for the chunk size. Is the only possible failure reason was the chunk size being zero, the method no longer needs to return a `Result`. This change will slightly simplify the implementation for #2328.
1 parent 09e8b33 commit f491da4

File tree

4 files changed

+15
-21
lines changed

4 files changed

+15
-21
lines changed

src/commands/build/upload.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ fn upload_file(
508508
pb.set_style(progress_style);
509509

510510
let chunk_size = chunk_upload_options.chunk_size as usize;
511-
let (checksum, checksums) = get_sha1_checksums(bytes, chunk_size)?;
511+
let (checksum, checksums) = get_sha1_checksums(bytes, chunk_size.try_into()?);
512512
let mut chunks = bytes
513513
.chunks(chunk_size)
514514
.zip(checksums.iter())

src/utils/chunks/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ where
6464
/// Creates a new `ChunkedObject` from the given object, using
6565
/// the given chunk size.
6666
pub fn from(object: T, chunk_size: usize) -> Result<Self> {
67-
let (checksum, chunks) = fs::get_sha1_checksums(object.as_ref(), chunk_size)?;
67+
let (checksum, chunks) = fs::get_sha1_checksums(object.as_ref(), chunk_size.try_into()?);
6868
Ok(Self {
6969
object,
7070
checksum,

src/utils/file_upload.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,8 @@ fn upload_files_chunked(
638638
pb.set_style(progress_style);
639639

640640
let view = ByteView::open(archive.path())?;
641-
let (checksum, checksums) = get_sha1_checksums(&view, options.chunk_size as usize)?;
641+
let (checksum, checksums) =
642+
get_sha1_checksums(&view, (options.chunk_size as usize).try_into()?);
642643
let mut chunks = view
643644
.chunks(options.chunk_size as usize)
644645
.zip(checksums.iter())

src/utils/fs.rs

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ use std::env;
22
use std::fs;
33
use std::io;
44
use std::io::{Read, Seek};
5+
use std::num::NonZeroUsize;
56
use std::path::{Path, PathBuf};
67

7-
use anyhow::{bail, Result};
8+
use anyhow::Result;
89
use flate2::read::GzDecoder;
910
use log::error;
1011
use sha1_smol::{Digest, Sha1};
@@ -159,22 +160,18 @@ pub fn get_sha1_checksum<R: Read>(rdr: R) -> Result<Digest> {
159160

160161
/// Returns the SHA1 hash for the entire input, as well as each chunk of it. The
161162
/// `chunk_size` must be non-zero.
162-
pub fn get_sha1_checksums(data: &[u8], chunk_size: usize) -> Result<(Digest, Vec<Digest>)> {
163-
if chunk_size == 0 {
164-
bail!("Chunk size may not be zero.");
165-
}
166-
163+
pub fn get_sha1_checksums(data: &[u8], chunk_size: NonZeroUsize) -> (Digest, Vec<Digest>) {
167164
let mut total_sha = Sha1::new();
168165
let mut chunks = Vec::new();
169166

170-
for chunk in data.chunks(chunk_size) {
167+
for chunk in data.chunks(chunk_size.into()) {
171168
let mut chunk_sha = Sha1::new();
172169
chunk_sha.update(chunk);
173170
total_sha.update(chunk);
174171
chunks.push(chunk_sha.digest());
175172
}
176173

177-
Ok((total_sha.digest(), chunks))
174+
(total_sha.digest(), chunks)
178175
}
179176

180177
/// Checks if provided slice contains gzipped data.
@@ -245,9 +242,10 @@ mod tests {
245242

246243
#[test]
247244
fn sha1_checksums_power_of_two() {
245+
const NONZERO_16: NonZeroUsize = NonZeroUsize::new(16).unwrap();
246+
248247
let data = b"this is some binary data for the test";
249-
let (total_sha, chunks) =
250-
get_sha1_checksums(data, 16).expect("Method should not fail because 16 is not zero");
248+
let (total_sha, chunks) = get_sha1_checksums(data, NONZERO_16);
251249

252250
assert_eq!(
253251
total_sha.to_string(),
@@ -268,10 +266,11 @@ mod tests {
268266

269267
#[test]
270268
fn sha1_checksums_not_power_of_two() {
269+
const NONZERO_17: NonZeroUsize = NonZeroUsize::new(17).unwrap();
270+
271271
let data = b"this is some binary data for the test";
272272

273-
let (total_sha, chunks) =
274-
get_sha1_checksums(data, 17).expect("Method should not fail because 17 is not zero");
273+
let (total_sha, chunks) = get_sha1_checksums(data, NONZERO_17);
275274

276275
assert_eq!(
277276
total_sha.to_string(),
@@ -289,10 +288,4 @@ mod tests {
289288
]
290289
);
291290
}
292-
293-
#[test]
294-
fn sha1_checksums_zero() {
295-
let data = b"this is some binary data for the test";
296-
get_sha1_checksums(data, 0).expect_err("Method should fail because 0 is zero");
297-
}
298291
}

0 commit comments

Comments
 (0)