diff options
| author | sigoden <sigoden@gmail.com> | 2024-04-21 06:52:22 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-21 06:52:22 +0800 |
| commit | b3162a72b50f88d78ca3d57c1f8b3421cecfe2b4 (patch) | |
| tree | cee11116acce66ffcc7599dc13dcc9588d174620 /src/render/stream.rs | |
| parent | 8b75080973e6caa3128e9673440a57deb38fc0c9 (diff) | |
| download | aichat-b3162a72b50f88d78ca3d57c1f8b3421cecfe2b4.tar.gz | |
refactor: shell execution with spinner and select prompt (#425)
Diffstat (limited to 'src/render/stream.rs')
| -rw-r--r-- | src/render/stream.rs | 51 |
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; |
