diff options
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/abort_signal.rs | 32 |
1 files changed, 28 insertions, 4 deletions
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<AbortSignalInner>; @@ -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<bool> { + 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) +} |
