github_bin_downloader/
utils.rs

1use crate::GBDResult;
2use indicatif::{ProgressBar, ProgressStyle};
3use reqwest::IntoUrl;
4use serde_json::Value;
5use std::{cmp::min, fs::File, io::Write};
6
7pub fn humanize_bytes(bytes: u64) -> String {
8    let values = ["bytes", "KB", "MB", "GB", "TB"];
9    let pair = values
10        .iter()
11        .enumerate()
12        .take_while(|x| bytes as usize / (1000_usize).pow(x.0 as u32) > 10)
13        .last();
14    if let Some((i, unit)) = pair {
15        format!("{} {}", bytes as usize / (1000_usize).pow(i as u32), unit)
16    } else {
17        format!("{} {}", bytes, values[0])
18    }
19}
20
21pub fn trim_newline(mut s: String) -> String {
22    if s.ends_with('\n') {
23        s.pop();
24        if s.ends_with('\r') {
25            s.pop();
26        }
27    }
28    s
29}
30
31pub fn compare_two_vector<T>(vec1: &[T], vec2: &[T]) -> Option<Vec<T>>
32where
33    T: PartialEq + Clone,
34{
35    let mut result: Vec<T> = Vec::new();
36    for v1 in vec1 {
37        for v2 in vec2 {
38            if v1 == v2 {
39                result.push(v1.clone());
40            }
41        }
42    }
43    if !result.is_empty() {
44        Some(result)
45    } else {
46        None
47    }
48}
49
50pub fn sanitize_str_to_string(string: &Value) -> String {
51    string.to_string().replace('"', "")
52}
53
54pub async fn download_file_from_url<T>(url: T, name: &str) -> GBDResult<()>
55where
56    T: IntoUrl,
57{
58    let mut resp = reqwest::get(url).await?;
59    resp.content_length();
60    let mut f = File::create(name)?;
61    let mut downloaded = 0;
62    let total_size = resp
63        .content_length()
64        .expect("Cannot determine size of the content!");
65    let pb = ProgressBar::new(total_size);
66    pb.set_style(ProgressStyle::default_bar()
67            .template("{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({eta})")
68            .progress_chars("#>-"));
69    while let Some(chunk) = resp.chunk().await? {
70        let new = min(downloaded + chunk.len() as u64, total_size);
71        downloaded = new;
72        pb.set_position(new);
73        f.write_all(&chunk[..])?;
74    }
75    Ok(())
76}