summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2024-04-21 06:52:22 +0800
committerGitHub <noreply@github.com>2024-04-21 06:52:22 +0800
commitb3162a72b50f88d78ca3d57c1f8b3421cecfe2b4 (patch)
treecee11116acce66ffcc7599dc13dcc9588d174620 /src/render
parent8b75080973e6caa3128e9673440a57deb38fc0c9 (diff)
downloadaichat-b3162a72b50f88d78ca3d57c1f8b3421cecfe2b4.tar.gz
refactor: shell execution with spinner and select prompt (#425)
Diffstat (limited to 'src/render')
-rw-r--r--src/render/stream.rs51
1 files changed, 1 insertions, 50 deletions
diff --git a/src/render/stream.rs b/src/render/stream.rs
index 8bb4a0e..9fdad5a 100644
--- a/src/render/stream.rs
+++ b/src/render/stream.rs
@@ -1,6 +1,6 @@
use super::{MarkdownRender, ReplyEvent};
-use crate::utils::AbortSignal;
+use crate::utils::{AbortSignal, Spinner};
use anyhow::Result;
use crossbeam::channel::Receiver;
@@ -164,55 +164,6 @@ fn markdown_stream_inner(
Ok(())
}
-struct Spinner {
- index: usize,
- message: String,
- stopped: bool,
-}
-
-impl Spinner {
- const DATA: [&'static str; 10] = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
-
- fn new(message: &str) -> Self {
- Spinner {
- index: 0,
- message: message.to_string(),
- stopped: false,
- }
- }
-
- fn step(&mut self, writer: &mut Stdout) -> Result<()> {
- if self.stopped {
- return Ok(());
- }
- let frame = Self::DATA[self.index % Self::DATA.len()];
- let dots = ".".repeat((self.index / 5) % 4);
- let line = format!("{frame}{}{:<3}", self.message, dots);
- queue!(writer, cursor::MoveToColumn(0), style::Print(line),)?;
- if self.index == 0 {
- queue!(writer, cursor::Hide)?;
- }
- writer.flush()?;
- self.index += 1;
- Ok(())
- }
-
- fn stop(&mut self, writer: &mut Stdout) -> Result<()> {
- if self.stopped {
- return Ok(());
- }
- self.stopped = true;
- queue!(
- writer,
- cursor::MoveToColumn(0),
- terminal::Clear(terminal::ClearType::FromCursorDown),
- cursor::Show
- )?;
- writer.flush()?;
- Ok(())
- }
-}
-
fn gather_events(rx: &Receiver<ReplyEvent>) -> Vec<ReplyEvent> {
let mut texts = vec![];
let mut done = false;