From bf07cdf256e1e3008578972f5916a4d6763554f5 Mon Sep 17 00:00:00 2001 From: sigoden Date: Tue, 29 Oct 2024 14:15:02 +0800 Subject: refactor: improve code quality (#956) --- src/utils/abort_signal.rs | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'src/utils') diff --git a/src/utils/abort_signal.rs b/src/utils/abort_signal.rs index 5329a9e..a13e5bb 100644 --- a/src/utils/abort_signal.rs +++ b/src/utils/abort_signal.rs @@ -1,6 +1,11 @@ -use std::sync::{ - atomic::{AtomicBool, Ordering}, - Arc, +use anyhow::Result; +use crossterm::event::{self, Event, KeyCode, KeyModifiers}; +use std::{ + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + time::Duration, }; pub type AbortSignal = Arc; @@ -54,7 +59,7 @@ impl AbortSignalInner { } } -pub async fn watch_abort_signal(abort_signal: AbortSignal) { +pub async fn wait_abort_signal(abort_signal: &AbortSignal) { loop { if abort_signal.aborted() { break; @@ -62,3 +67,22 @@ pub async fn watch_abort_signal(abort_signal: AbortSignal) { tokio::time::sleep(std::time::Duration::from_millis(25)).await; } } + +pub fn poll_abort_signal(abort_signal: &AbortSignal) -> Result { + if crossterm::event::poll(Duration::from_millis(25))? { + if let Event::Key(key) = event::read()? { + match key.code { + KeyCode::Char('c') if key.modifiers == KeyModifiers::CONTROL => { + abort_signal.set_ctrlc(); + return Ok(true); + } + KeyCode::Char('d') if key.modifiers == KeyModifiers::CONTROL => { + abort_signal.set_ctrld(); + return Ok(true); + } + _ => {} + } + } + } + Ok(false) +} -- cgit v1.2.3