From 1cc89eff514669d6459f62cc4eed8e0b34d8ef0c Mon Sep 17 00:00:00 2001 From: sigoden Date: Tue, 23 Apr 2024 14:32:06 +0800 Subject: refactor: more async code (#427) --- src/utils/spinner.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'src/utils/spinner.rs') diff --git a/src/utils/spinner.rs b/src/utils/spinner.rs index 3715eff..0dd4d01 100644 --- a/src/utils/spinner.rs +++ b/src/utils/spinner.rs @@ -2,10 +2,9 @@ use anyhow::Result; use crossterm::{cursor, queue, style, terminal}; use std::{ io::{stdout, Stdout, Write}, - sync::mpsc, - thread, time::Duration, }; +use tokio::{sync::oneshot, time::interval}; pub struct Spinner { index: usize, @@ -56,17 +55,20 @@ impl Spinner { } } -pub fn run_spinner(message: &str, rx: mpsc::Receiver<()>) -> Result<()> { +pub async fn run_spinner(message: &str, rx: oneshot::Receiver<()>) -> Result<()> { let mut writer = stdout(); let mut spinner = Spinner::new(message); - loop { - spinner.step(&mut writer)?; - if let Ok(()) = rx.try_recv() { + let mut interval = interval(Duration::from_millis(50)); + tokio::select! { + _ = async { + loop { + interval.tick().await; + let _ = spinner.step(&mut writer); + } + } => {} + _ = rx => { spinner.stop(&mut writer)?; - break; } - thread::sleep(Duration::from_millis(50)) } - spinner.stop(&mut writer)?; Ok(()) } -- cgit v1.2.3