github_bin_downloader/
utils.rs1use 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}