Skip to main content

kget/
progress.rs

1//! Progress bar utilities for download visualization.
2//!
3//! This module provides a customizable progress bar for tracking downloads
4//! in the terminal.
5//!
6//! # Example
7//!
8//! ```rust,no_run
9//! use kget::create_progress_bar;
10//!
11//! // Create a progress bar for a 100MB file
12//! let pb = create_progress_bar(false, "Downloading file.zip".into(), Some(100_000_000), false);
13//! pb.set_position(50_000_000); // 50% complete
14//! pb.finish_with_message("Download complete!");
15//! ```
16
17use indicatif::{ProgressBar, ProgressStyle};
18
19/// Create a progress bar for download tracking.
20///
21/// # Arguments
22///
23/// * `quiet_mode` - If true, returns a hidden progress bar (no output)
24/// * `msg` - Message to display above the progress bar
25/// * `length` - Total size in bytes (None for indeterminate spinner)
26/// * `is_parallel` - If true, shows chunk information for parallel downloads
27///
28/// # Returns
29///
30/// A configured [`ProgressBar`] ready for use.
31///
32/// # Example
33///
34/// ```rust,no_run
35/// use kget::create_progress_bar;
36///
37/// // Determinate progress bar
38/// let pb = create_progress_bar(false, "file.zip".into(), Some(1000), false);
39///
40/// // Indeterminate spinner (unknown size)
41/// let spinner = create_progress_bar(false, "Connecting...".into(), None, false);
42///
43/// // Parallel download progress
44/// let parallel = create_progress_bar(false, "file.iso".into(), Some(4_000_000_000), true);
45/// ```
46pub fn create_progress_bar(quiet_mode: bool, msg: String, length: Option<u64>, is_parallel: bool) -> ProgressBar {
47    let bar = if quiet_mode {
48        ProgressBar::hidden()
49    } else {
50        match length {
51            Some(len) => ProgressBar::new(len),
52            None => ProgressBar::new_spinner(),
53        }
54    };
55
56    bar.set_message(msg);
57    
58    if let Some(_) = length {
59        let template = if is_parallel {
60            "{msg}\n{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({percent}%) eta: {eta} speed: {binary_bytes_per_sec}\nChunks: {chunks} active"
61        } else {
62            "{msg}\n{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({percent}%) eta: {eta} speed: {binary_bytes_per_sec}"
63        };
64
65        bar.set_style(
66            ProgressStyle::default_bar()
67                .template(template)
68                .unwrap()
69                .progress_chars("=>-")
70        );
71    } else {
72        bar.set_style(
73            ProgressStyle::default_spinner()
74                .template("{spinner:.green} {msg} {elapsed}")
75                .unwrap()
76        );
77    }
78
79    bar
80}