diff options
| author | sigoden <sigoden@gmail.com> | 2024-10-29 14:15:02 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-29 14:15:02 +0800 |
| commit | bf07cdf256e1e3008578972f5916a4d6763554f5 (patch) | |
| tree | 3f48ead051403a7f270198578e86a92672bb4208 /src/utils | |
| parent | bb542f6e92fd782b70c44fddb21d013c289d0a3c (diff) | |
| download | aichat-bf07cdf256e1e3008578972f5916a4d6763554f5.tar.gz | |
refactor: improve code quality (#956)
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) +} |
