summaryrefslogtreecommitdiffstats
path: root/src/client.rs
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2023-03-07 11:51:52 +0800
committerGitHub <noreply@github.com>2023-03-07 11:51:52 +0800
commit11dc4d104b21b75d63e10e42ea4ee767c7bd5fdf (patch)
tree338a2a1d9eed095762fd61ee41437aa2b4e3f991 /src/client.rs
parent1640456049cda9999bb27501af30e05e46b0360d (diff)
downloadaichat-11dc4d104b21b75d63e10e42ea4ee767c7bd5fdf.tar.gz
refactor: optimize ctrl+c/ctrl+d abort handling (#27)
Diffstat (limited to 'src/client.rs')
-rw-r--r--src/client.rs15
1 files changed, 7 insertions, 8 deletions
diff --git a/src/client.rs b/src/client.rs
index 589ad1a..19e6c27 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -1,13 +1,12 @@
use crate::config::SharedConfig;
-use crate::repl::ReplyStreamHandler;
+use crate::repl::{ReplyStreamHandler, SharedAbortSignal};
use anyhow::{anyhow, Context, Result};
use eventsource_stream::Eventsource;
use futures_util::StreamExt;
use reqwest::{Client, Proxy, RequestBuilder};
use serde_json::{json, Value};
-use std::sync::atomic::{AtomicBool, Ordering};
-use std::{sync::Arc, time::Duration};
+use std::time::Duration;
use tokio::runtime::Runtime;
use tokio::time::sleep;
@@ -43,27 +42,27 @@ impl ChatGptClient {
prompt: Option<String>,
handler: &mut ReplyStreamHandler,
) -> Result<()> {
- async fn watch_ctrlc(ctrlc: Arc<AtomicBool>) {
+ async fn watch_abort(abort: SharedAbortSignal) {
loop {
- if ctrlc.load(Ordering::SeqCst) {
+ if abort.aborted() {
break;
}
sleep(Duration::from_millis(100)).await;
}
}
- let ctrlc = handler.get_ctrlc();
+ let abort = handler.get_abort();
self.runtime.block_on(async {
tokio::select! {
ret = self.send_message_streaming_inner(input, prompt, handler) => {
handler.done();
ret.with_context(|| "Failed to send message streaming")
}
- _ = watch_ctrlc(ctrlc.clone()) => {
+ _ = watch_abort(abort.clone()) => {
handler.done();
Ok(())
},
_ = tokio::signal::ctrl_c() => {
- ctrlc.store(true, Ordering::SeqCst);
+ abort.set_ctrlc();
Ok(())
}
}