From b3162a72b50f88d78ca3d57c1f8b3421cecfe2b4 Mon Sep 17 00:00:00 2001 From: sigoden Date: Sun, 21 Apr 2024 06:52:22 +0800 Subject: refactor: shell execution with spinner and select prompt (#425) --- src/render/stream.rs | 51 +-------------------------------------------------- 1 file changed, 1 insertion(+), 50 deletions(-) (limited to 'src/render/stream.rs') 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) -> Vec { let mut texts = vec![]; let mut done = false; -- cgit v1.2.3