From 360264121ca2931cb7f2fa40594ba590b245ace5 Mon Sep 17 00:00:00 2001 From: sigoden Date: Tue, 7 Mar 2023 22:33:34 +0800 Subject: feat: command mode supports stream out (#31) * feat: command mode supports stream out * update cli --- src/render/cmd.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/render/cmd.rs (limited to 'src/render/cmd.rs') 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, 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(()) +} -- cgit v1.2.3