1
0
Fork 0
This commit is contained in:
Florian RICHER (MrDev023) 2021-07-24 13:37:14 +02:00
commit 687ce0f7bb
14 changed files with 2120 additions and 0 deletions

3
src/common/mod.rs Normal file
View file

@ -0,0 +1,3 @@
pub static TEMP_FOLDER: &str = "temp";
pub mod utils;

View file

@ -0,0 +1,17 @@
use std::{fs, path::PathBuf};
fn create_download_folder() -> Option<()> {
fs::create_dir_all(super::super::TEMP_FOLDER).ok()
}
pub fn download_file(url : &String, filename: &str) -> Option<PathBuf> {
create_download_folder()?;
let mut response = reqwest::blocking::get(url).ok()?;
let fname = std::path::Path::new(super::super::TEMP_FOLDER).join(filename);
let mut dest = fs::File::create(fname.clone()).ok()?;
response.copy_to(&mut dest).ok()?;
Some(fname)
}

View file

@ -0,0 +1,55 @@
use crate::common;
use std::{fs::{
File,
create_dir_all
}, io, path::{self, PathBuf}};
pub fn extract_file(path: &PathBuf, outdir: &str) -> Option<()> {
let file = File::open(&path).unwrap();
let mut archive = match zip::ZipArchive::new(file) {
Ok(archive) => archive,
Err(err) => {
println!("[ERROR][EXTRACTOR] {}", err);
return None
}
};
let path = path::Path::new(common::TEMP_FOLDER).join(outdir);
for i in 0..archive.len() {
let mut file = archive.by_index(i).ok()?;
let file_path = file.enclosed_name()?;
let output_path = path.join(file_path);
if (&*file.name()).ends_with('/') {
println!("File {} extracted to \"{}\"", i, output_path.display());
create_dir_all(&output_path).unwrap();
} else {
println!(
"File {} extracted to \"{}\" ({} bytes)",
i,
output_path.display(),
file.size()
);
if let Some(p) = output_path.parent() {
if !p.exists() {
create_dir_all(&p).unwrap();
}
}
let mut outfile = File::create(&output_path).unwrap();
io::copy(&mut file, &mut outfile).unwrap();
}
// Get and Set permissions
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt;
if let Some(mode) = file.unix_mode() {
fs::set_permissions(&outpath, fs::Permissions::from_mode(mode)).unwrap();
}
}
}
Some(())
}

39
src/common/utils/git.rs Normal file
View file

@ -0,0 +1,39 @@
use serde_derive::{Serialize, Deserialize};
use reqwest::header;
#[derive(Serialize, Deserialize, Debug)]
pub struct Asset {
pub browser_download_url: String,
pub name: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GitResponse {
pub assets: Vec<Asset>
}
pub fn get_git_release_by_version(repo: &str, version: &str) -> Option<GitResponse> {
let url = format!("https://api.github.com/repos/{}/releases/{}", repo, version);
let mut headers = header::HeaderMap::new();
headers.append(header::USER_AGENT, header::HeaderValue::from_static("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55"));
let data = reqwest::blocking::Client::builder()
.default_headers(headers)
.build()
.ok()?
.get(url)
.send()
.ok()?
.text()
.ok()?;
let git_response : GitResponse = serde_json::from_str(&data)
.ok()?;
Some(git_response)
}
pub fn get_git_latest_release(repo: &str) -> Option<GitResponse> {
Some(get_git_release_by_version(repo, "latest")?)
}

3
src/common/utils/mod.rs Normal file
View file

@ -0,0 +1,3 @@
pub mod downloader;
pub mod extractor;
pub mod git;