diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-05-17 10:29:45 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-05-17 10:29:45 +0200 |
commit | 56f606565fd957d8b376432a58e605c441dfb7b8 (patch) | |
tree | 464fecb6fe25de6adc5cb3075263710f82a17811 /src/commands/source.rs | |
parent | 8507a747e5234d5f70c1e148c58e41a876954270 (diff) | |
parent | 53870e95dc563a50a13861aedcf98fbf4a176abc (diff) |
Merge branch 'download-graceful-error-reporting'
Diffstat (limited to 'src/commands/source.rs')
-rw-r--r-- | src/commands/source.rs | 86 |
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(()) + } } } }) |