kget/
progress.rs

1use indicatif::{ProgressBar, ProgressStyle};
2
3/// Make a custom progress bar for file downloads
4/// 
5/// # Arguments
6///
7/// * `quiet_mode` - If true, the progress bar will be hidden
8/// * `msg` - Message to be displayed on the bar
9/// * `length` - Total file size in bytes (optional)
10/// * `is_parallel` - If true, shows parallel download information
11///
12/// # Returns
13///
14/// A progress bar configured with a custom style
15pub fn create_progress_bar(quiet_mode: bool, msg: String, length: Option<u64>, is_parallel: bool) -> ProgressBar {
16    let bar = if quiet_mode {
17        ProgressBar::hidden()
18    } else {
19        match length {
20            Some(len) => ProgressBar::new(len),
21            None => ProgressBar::new_spinner(),
22        }
23    };
24
25    bar.set_message(msg);
26    
27    if let Some(_) = length {
28        let template = if is_parallel {
29            "{msg}\n{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({percent}%) eta: {eta} speed: {binary_bytes_per_sec}\nChunks: {chunks} active"
30        } else {
31            "{msg}\n{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({percent}%) eta: {eta} speed: {binary_bytes_per_sec}"
32        };
33
34        bar.set_style(
35            ProgressStyle::default_bar()
36                .template(template)
37                .unwrap()
38                .progress_chars("=>-")
39        );
40    } else {
41        bar.set_style(
42            ProgressStyle::default_spinner()
43                .template("{spinner:.green} {msg} {elapsed}")
44                .unwrap()
45        );
46    }
47
48    bar
49}