smaug_lib/sources/
url_source.rs

1use 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}