1*c2e18aaaSAndroid Build Coastguard Worker use std::io::{self, Write};
2*c2e18aaaSAndroid Build Coastguard Worker use std::sync::{Arc, LazyLock, Mutex};
3*c2e18aaaSAndroid Build Coastguard Worker use std::thread;
4*c2e18aaaSAndroid Build Coastguard Worker use std::time::{Duration, Instant};
5*c2e18aaaSAndroid Build Coastguard Worker
6*c2e18aaaSAndroid Build Coastguard Worker static PROGRESS: LazyLock<Progress> = LazyLock::new(|| Progress {
7*c2e18aaaSAndroid Build Coastguard Worker message: Arc::new(Mutex::new("".to_string())),
8*c2e18aaaSAndroid Build Coastguard Worker is_complete: Arc::new(Mutex::new(false)),
9*c2e18aaaSAndroid Build Coastguard Worker });
10*c2e18aaaSAndroid Build Coastguard Worker
11*c2e18aaaSAndroid Build Coastguard Worker pub struct Progress {
12*c2e18aaaSAndroid Build Coastguard Worker message: Arc<Mutex<String>>,
13*c2e18aaaSAndroid Build Coastguard Worker is_complete: Arc<Mutex<bool>>,
14*c2e18aaaSAndroid Build Coastguard Worker }
15*c2e18aaaSAndroid Build Coastguard Worker
16*c2e18aaaSAndroid Build Coastguard Worker impl Progress {
start(&self)17*c2e18aaaSAndroid Build Coastguard Worker fn start(&self) {
18*c2e18aaaSAndroid Build Coastguard Worker let is_complete = self.is_complete.clone();
19*c2e18aaaSAndroid Build Coastguard Worker let message_ref = self.message.clone();
20*c2e18aaaSAndroid Build Coastguard Worker thread::spawn(move || {
21*c2e18aaaSAndroid Build Coastguard Worker let start = Instant::now();
22*c2e18aaaSAndroid Build Coastguard Worker while !*is_complete.lock().unwrap() {
23*c2e18aaaSAndroid Build Coastguard Worker let minutes = start.elapsed().as_secs() / 60;
24*c2e18aaaSAndroid Build Coastguard Worker let seconds = start.elapsed().as_secs() % 60;
25*c2e18aaaSAndroid Build Coastguard Worker let mut message =
26*c2e18aaaSAndroid Build Coastguard Worker format!(" {:01}:{:02} {}", minutes, seconds, message_ref.lock().unwrap());
27*c2e18aaaSAndroid Build Coastguard Worker if message.len() > 80 {
28*c2e18aaaSAndroid Build Coastguard Worker message.truncate(77);
29*c2e18aaaSAndroid Build Coastguard Worker message.push('…');
30*c2e18aaaSAndroid Build Coastguard Worker }
31*c2e18aaaSAndroid Build Coastguard Worker print!("\x1B[2K"); // clear the line
32*c2e18aaaSAndroid Build Coastguard Worker print!("\r{} ", message);
33*c2e18aaaSAndroid Build Coastguard Worker io::stdout().flush().unwrap();
34*c2e18aaaSAndroid Build Coastguard Worker thread::sleep(Duration::from_millis(100));
35*c2e18aaaSAndroid Build Coastguard Worker }
36*c2e18aaaSAndroid Build Coastguard Worker let mut complete = PROGRESS.is_complete.lock().unwrap();
37*c2e18aaaSAndroid Build Coastguard Worker *complete = false;
38*c2e18aaaSAndroid Build Coastguard Worker });
39*c2e18aaaSAndroid Build Coastguard Worker }
40*c2e18aaaSAndroid Build Coastguard Worker
stop(&self)41*c2e18aaaSAndroid Build Coastguard Worker fn stop(&self) {
42*c2e18aaaSAndroid Build Coastguard Worker let mut is_complete = self.is_complete.lock().unwrap();
43*c2e18aaaSAndroid Build Coastguard Worker *is_complete = true;
44*c2e18aaaSAndroid Build Coastguard Worker print!("\x1B[2K"); // clear the line
45*c2e18aaaSAndroid Build Coastguard Worker print!("\r");
46*c2e18aaaSAndroid Build Coastguard Worker io::stdout().flush().unwrap();
47*c2e18aaaSAndroid Build Coastguard Worker }
48*c2e18aaaSAndroid Build Coastguard Worker }
49*c2e18aaaSAndroid Build Coastguard Worker
update(message: &str)50*c2e18aaaSAndroid Build Coastguard Worker pub fn update(message: &str) {
51*c2e18aaaSAndroid Build Coastguard Worker let mut new_message = PROGRESS.message.lock().unwrap();
52*c2e18aaaSAndroid Build Coastguard Worker *new_message = message.to_string();
53*c2e18aaaSAndroid Build Coastguard Worker }
54*c2e18aaaSAndroid Build Coastguard Worker
start(message: &str)55*c2e18aaaSAndroid Build Coastguard Worker pub fn start(message: &str) {
56*c2e18aaaSAndroid Build Coastguard Worker update(message);
57*c2e18aaaSAndroid Build Coastguard Worker PROGRESS.start();
58*c2e18aaaSAndroid Build Coastguard Worker }
59*c2e18aaaSAndroid Build Coastguard Worker
stop()60*c2e18aaaSAndroid Build Coastguard Worker pub fn stop() {
61*c2e18aaaSAndroid Build Coastguard Worker PROGRESS.stop();
62*c2e18aaaSAndroid Build Coastguard Worker }
63