diff options
| author | sigoden <sigoden@gmail.com> | 2023-03-07 22:33:34 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-07 22:33:34 +0800 |
| commit | 360264121ca2931cb7f2fa40594ba590b245ace5 (patch) | |
| tree | 71e81208cf50b02116c89974aca17a3cc762b1fc /src/render/cmd.rs | |
| parent | c7fcdb174440817706b818154a6bbcaf58948caa (diff) | |
| download | aichat-360264121ca2931cb7f2fa40594ba590b245ace5.tar.gz | |
feat: command mode supports stream out (#31)
* feat: command mode supports stream out
* update cli
Diffstat (limited to 'src/render/cmd.rs')
| -rw-r--r-- | src/render/cmd.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/render/cmd.rs b/src/render/cmd.rs new file mode 100644 index 0000000..f29fe7d --- /dev/null +++ b/src/render/cmd.rs @@ -0,0 +1,37 @@ +use super::MarkdownRender; +use crate::repl::{ReplyStreamEvent, SharedAbortSignal}; +use crate::utils::dump; + +use anyhow::Result; +use crossbeam::channel::Receiver; + +pub fn cmd_render_stream(rx: Receiver<ReplyStreamEvent>, abort: SharedAbortSignal) -> Result<()> { + let mut buffer = String::new(); + let mut markdown_render = MarkdownRender::new(); + loop { + if abort.aborted() { + return Ok(()); + } + if let Ok(evt) = rx.try_recv() { + match evt { + ReplyStreamEvent::Text(text) => { + if text.contains('\n') { + let text = format!("{buffer}{text}"); + let mut lines: Vec<&str> = text.split('\n').collect(); + buffer = lines.pop().unwrap_or_default().to_string(); + let output = lines.join("\n"); + dump(markdown_render.render(&output), 1); + } else { + buffer = format!("{buffer}{text}"); + } + } + ReplyStreamEvent::Done => { + let output = markdown_render.render(&buffer); + dump(output, 2); + break; + } + } + } + } + Ok(()) +} |
