diff --git a/src/config/mod.rs b/src/config/mod.rs index 26c0bda4..7ca19723 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -29,7 +29,7 @@ use std::{ fs::{create_dir_all, read_dir, read_to_string, remove_file, File, OpenOptions}, io::Write, path::{Path, PathBuf}, - process::exit, + process, sync::Arc, }; use syntect::highlighting::ThemeSet; @@ -1529,7 +1529,7 @@ fn create_config_file(config_path: &Path) -> Result<()> { .with_default(true) .prompt()?; if !ans { - exit(0); + process::exit(0); } let client = Select::new("Platform:", list_client_types()).prompt()?; diff --git a/src/utils/abort_signal.rs b/src/utils/abort_signal.rs index 3a8007df..5329a9ed 100644 --- a/src/utils/abort_signal.rs +++ b/src/utils/abort_signal.rs @@ -59,6 +59,6 @@ pub async fn watch_abort_signal(abort_signal: AbortSignal) { if abort_signal.aborted() { break; } - tokio::time::sleep(std::time::Duration::from_millis(100)).await; + tokio::time::sleep(std::time::Duration::from_millis(25)).await; } } diff --git a/src/utils/spinner.rs b/src/utils/spinner.rs index 72fd868d..8df4f577 100644 --- a/src/utils/spinner.rs +++ b/src/utils/spinner.rs @@ -2,7 +2,7 @@ use anyhow::Result; use crossterm::{cursor, queue, style, terminal}; use is_terminal::IsTerminal; use std::{ - io::{stdout, Stdout, Write}, + io::{stdout, Write}, time::Duration, }; use tokio::{ @@ -31,14 +31,20 @@ impl Spinner { self.message = format!(" {message}"); } - pub fn step(&mut self, writer: &mut Stdout) -> Result<()> { + pub fn step(&mut self) -> Result<()> { if self.stopped { return Ok(()); } + let mut writer = stdout(); let frame = Self::DATA[self.index % Self::DATA.len()]; let dots = ".".repeat((self.index / 5) % 4); let line = format!("{frame}{}{:<3}", self.message, dots); - queue!(writer, cursor::MoveToColumn(0), style::Print(line),)?; + queue!( + writer, + cursor::MoveToColumn(0), + terminal::Clear(terminal::ClearType::FromCursorDown), + style::Print(line), + )?; if self.index == 0 { queue!(writer, cursor::Hide)?; } @@ -47,10 +53,11 @@ impl Spinner { Ok(()) } - pub fn stop(&mut self, writer: &mut Stdout) -> Result<()> { + pub fn stop(&mut self) -> Result<()> { if self.stopped { return Ok(()); } + let mut writer = stdout(); self.stopped = true; queue!( writer, @@ -76,7 +83,6 @@ async fn run_spinner_inner( stop_rx: oneshot::Receiver<()>, mut message_rx: mpsc::UnboundedReceiver, ) -> Result<()> { - let mut writer = stdout(); let is_stdout_terminal = stdout().is_terminal(); let mut spinner = Spinner::new(&message); let mut interval = interval(Duration::from_millis(50)); @@ -86,7 +92,7 @@ async fn run_spinner_inner( tokio::select! { _ = interval.tick() => { if is_stdout_terminal { - let _ = spinner.step(&mut writer); + let _ = spinner.step(); } } message = message_rx.recv() => { @@ -99,7 +105,7 @@ async fn run_spinner_inner( } => {} _ = stop_rx => { if is_stdout_terminal { - spinner.stop(&mut writer)?; + spinner.stop()?; } } }