liboxen/util/
progress_bar.rs

1use std::sync::Arc;
2use tokio::time::Duration;
3
4use indicatif::{ProgressBar, ProgressStyle};
5
6pub enum ProgressBarType {
7    Counter,
8    Bytes,
9    None,
10}
11
12pub fn spinner_with_msg(msg: impl AsRef<str>) -> ProgressBar {
13    let spinner = ProgressBar::new_spinner();
14    spinner.set_message(msg.as_ref().to_owned());
15    spinner.set_style(ProgressStyle::default_spinner());
16    spinner.enable_steady_tick(Duration::from_millis(100));
17    spinner
18}
19
20pub fn oxen_progress_bar(size: u64, progress_type: ProgressBarType) -> Arc<ProgressBar> {
21    let bar = Arc::new(ProgressBar::new(size));
22    bar.set_style(
23        ProgressStyle::default_bar()
24            .template(progress_type_to_template(progress_type).as_str())
25            .unwrap()
26            .progress_chars("πŸŒΎπŸ‚βž–"),
27    );
28    bar
29}
30
31pub fn oxen_progress_bar_indeterminate(
32    size: u64,
33    progress_type: ProgressBarType,
34) -> Arc<ProgressBar> {
35    let bar = Arc::new(ProgressBar::new(size));
36    bar.set_style(
37        ProgressStyle::default_bar()
38            .template(progress_type_to_template(progress_type).as_str())
39            .unwrap()
40            .progress_chars("πŸŒΎπŸ‚βž–"),
41    );
42    bar
43}
44
45pub fn oxen_progress_bar_with_msg(size: u64, msg: impl AsRef<str>) -> Arc<ProgressBar> {
46    let bar = Arc::new(ProgressBar::new(size));
47    bar.set_message(msg.as_ref().to_owned());
48    bar.set_style(
49        ProgressStyle::default_bar()
50            .template(progress_type_to_template(ProgressBarType::Counter).as_str())
51            .unwrap()
52            .progress_chars("πŸŒΎπŸ‚βž–"),
53    );
54    bar
55}
56
57// Modify styling to oxen bar - necessary for bars which start out as spinners
58pub fn oxify_bar(bar: Arc<ProgressBar>, progress_type: ProgressBarType) -> Arc<ProgressBar> {
59    bar.set_style(
60        ProgressStyle::default_bar()
61            .template(progress_type_to_template(progress_type).as_str())
62            .unwrap()
63            .progress_chars("πŸŒΎπŸ‚βž–"),
64    );
65    bar
66}
67
68pub fn progress_type_to_template(progress_type: ProgressBarType) -> String {
69    match progress_type {
70        ProgressBarType::Counter => {
71            "{spinner:.green} {msg} [{elapsed_precise}] [{wide_bar}] {pos}/{len}".to_string()
72        }
73        ProgressBarType::Bytes => {
74            "{spinner:.green} [{elapsed_precise}] [{wide_bar}] {bytes}/{total_bytes}".to_string()
75        }
76        ProgressBarType::None => "{spinner:.green} [{elapsed_precise}] [{wide_bar}]".to_string(),
77    }
78}