liboxen/util/
progress_bar.rs1use 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
57pub 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}