smaug_lib/sources/
url_source.rs1use crate::dependency::Dependency;
2use crate::source::Source;
3use crate::sources::file_source::FileSource;
4use log::*;
5use std::fs::File;
6use std::path::Path;
7
8#[derive(Clone, Debug)]
9pub struct UrlSource {
10 pub url: String,
11}
12
13impl Source for UrlSource {
14 fn install(&self, dependency: &Dependency, destination: &Path) -> std::io::Result<()> {
15 trace!("Downloading Url from {}", self.url);
16 let file_name = format!("{}.zip", dependency.clone().name);
17 let cached = crate::smaug::cache_dir().join(file_name);
18
19 if cached.exists() {
20 std::fs::remove_file(cached.clone())?;
21 }
22
23 trace!("Downloading package to {}", cached.display());
24 std::fs::create_dir_all(cached.parent().unwrap())?;
25 let mut file = File::create(cached.clone())?;
26 let response = reqwest::blocking::get(self.url.as_str());
27
28 match response {
29 Err(..) => Err(std::io::Error::new(
30 std::io::ErrorKind::NotFound,
31 "Couldn't download file.",
32 )),
33 Ok(mut response) => {
34 std::io::copy(&mut response, &mut file)?;
35 FileSource { path: cached }.install(dependency, destination)
36 }
37 }
38 }
39}