summaryrefslogtreecommitdiffstats
path: root/src/commands/source.rs
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-05-17 10:29:45 +0200
committerMatthias Beyer <mail@beyermatthias.de>2021-05-17 10:29:45 +0200
commit56f606565fd957d8b376432a58e605c441dfb7b8 (patch)
tree464fecb6fe25de6adc5cb3075263710f82a17811 /src/commands/source.rs
parent8507a747e5234d5f70c1e148c58e41a876954270 (diff)
parent53870e95dc563a50a13861aedcf98fbf4a176abc (diff)
Merge branch 'download-graceful-error-reporting'
Diffstat (limited to 'src/commands/source.rs')
-rw-r--r--src/commands/source.rs86
1 files changed, 53 insertions, 33 deletions
diff --git a/src/commands/source.rs b/src/commands/source.rs
index c72cd08..cd33921 100644
--- a/src/commands/source.rs
+++ b/src/commands/source.rs
@@ -260,44 +260,64 @@ pub async fn download(
if source_path_exists && !force {
Err(anyhow!("Source exists: {}", source.path().display()))
} else {
- if source_path_exists {
- let _ = source.remove_file().await?;
- }
+ async fn perform_download(source: &SourceEntry, bar: &indicatif::ProgressBar) -> Result<()> {
+ trace!("Creating: {:?}", source);
+ let file = source.create().await.with_context(|| {
+ anyhow!(
+ "Creating source file destination: {}",
+ source.path().display()
+ )
+ })?;
+
+ let mut file = tokio::io::BufWriter::new(file);
+ let response = match reqwest::get(source.url().as_ref()).await {
+ Ok(resp) => resp,
+ Err(e) => {
+ bar.finish_with_message(format!("Failed: {}", source.url()));
+ return Err(e).with_context(|| anyhow!("Downloading '{}'", source.url()))
+ }
+ };
- trace!("Creating: {:?}", source);
- let file = source.create().await.with_context(|| {
- anyhow!(
- "Creating source file destination: {}",
- source.path().display()
- )
- })?;
-
- let mut file = tokio::io::BufWriter::new(file);
- let response = reqwest::get(source.url().as_ref())
- .await
- .with_context(|| anyhow!("Downloading '{}'", source.url()))?;
-
- if let Some(len) = response.content_length() {
- bar.set_length(len);
- }
- let mut stream = reqwest::get(source.url().as_ref()).await?.bytes_stream();
- let mut bytes_written = 0;
- while let Some(bytes) = stream.next().await {
- let bytes = bytes?;
- file.write_all(bytes.as_ref()).await?;
- bytes_written += bytes.len();
-
- bar.inc(bytes.len() as u64);
if let Some(len) = response.content_length() {
- bar.set_message(format!("Downloading {} ({}/{} bytes)", source.url(), bytes_written, len));
- } else {
- bar.set_message(format!("Downloading {} ({} bytes)", source.url(), bytes_written));
+ bar.set_length(len);
+ }
+
+ let mut stream = reqwest::get(source.url().as_ref()).await?.bytes_stream();
+ let mut bytes_written = 0;
+ while let Some(bytes) = stream.next().await {
+ let bytes = bytes?;
+ file.write_all(bytes.as_ref()).await?;
+ bytes_written += bytes.len();
+
+ bar.inc(bytes.len() as u64);
+ if let Some(len) = response.content_length() {
+ bar.set_message(format!("Downloading {} ({}/{} bytes)", source.url(), bytes_written, len));
+ } else {
+ bar.set_message(format!("Downloading {} ({} bytes)", source.url(), bytes_written));
+ }
+ }
+
+ file.flush()
+ .await
+ .map_err(Error::from)
+ .map(|_| ())
+ }
+
+ if source_path_exists /* && force is implied by 'if' above*/ {
+ if let Err(e) = source.remove_file().await {
+ bar.finish_with_message(format!("Failed to remove existing file: {}", source.path().display()));
+ return Err(e)
}
}
- file.flush().await?;
- bar.finish_with_message("Finished download");
- Ok(())
+
+ if let Err(e) = perform_download(&source, &bar).await {
+ bar.finish_with_message(format!("Failed: {}", source.url()));
+ Err(e)
+ } else {
+ bar.finish_with_message(format!("Finished: {}", source.url()));
+ Ok(())
+ }
}
}
})