summaryrefslogtreecommitdiffstats
path: root/src/utils/abort_signal.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/abort_signal.rs')
-rw-r--r--src/utils/abort_signal.rs32
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)
+}