1use std::fs::File;
2use std::path::PathBuf;
3
4use deflate::ChecksumSource;
5use deflate::HttpDeflateOption;
6use rootcause::prelude::ResultExt;
7
8pub mod deflate;
9pub mod github;
10
11pub fn run(
24 url: &str,
25 deflate_opt: &HttpDeflateOption,
26 checksum: Option<&ChecksumSource>,
27) -> rootcause::Result<PathBuf> {
28 let tmp_dir = tempfile::tempdir().context("error creating tmp dir for download")?;
30 let tmp_file = tmp_dir.path().join("download");
31
32 let resp = ureq::get(url)
33 .call()
34 .context("error downloading")
35 .attach_with(|| format!("url={url}"))?;
36
37 let mut file = File::create(&tmp_file).context("error creating tmp file")?;
38 std::io::copy(&mut resp.into_body().as_reader(), &mut file)
39 .context("error writing download to tmp file")
40 .attach_with(|| format!("url={url}"))?;
41
42 if let Some(source) = checksum {
44 let expected = crate::downloaders::checksum::download_and_find_checksum(source.checksums_url, source.filename)?;
45 crate::downloaders::checksum::verify(&tmp_file, &expected)?;
46 }
47
48 deflate_opt.process(&tmp_file)
50}