summaryrefslogtreecommitdiffstats
path: root/src/render/cmd.rs
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2023-11-08 18:26:38 +0800
committerGitHub <noreply@github.com>2023-11-08 18:26:38 +0800
commiteb30d90391ef73429589a98f34dfe4d3d88d0a38 (patch)
tree3ba569b16048a289d729262ffce475d610e51187 /src/render/cmd.rs
parenta8a504e0f07c2d1c725bace7f0affb468cf0622d (diff)
downloadaichat-eb30d90391ef73429589a98f34dfe4d3d88d0a38.tar.gz
refactor: improve render (#235)
* refactor: redesign render - if stdout is not terminal, just write reply text to stdout - rename repl_render_stream to markdown_stream - deprecate cmd_render_stream - use raw_stream to just print streaming reply text * optimize rendering error * optimize render_stream
Diffstat (limited to 'src/render/cmd.rs')
-rw-r--r--src/render/cmd.rs64
1 files changed, 0 insertions, 64 deletions
diff --git a/src/render/cmd.rs b/src/render/cmd.rs
deleted file mode 100644
index e942025..0000000
--- a/src/render/cmd.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-use super::{MarkdownRender, ReplyEvent};
-
-use crate::utils::{split_line_sematic, split_line_tail, AbortSignal};
-
-use anyhow::Result;
-use crossbeam::channel::Receiver;
-use textwrap::core::display_width;
-
-pub fn cmd_render_stream(
- rx: &Receiver<ReplyEvent>,
- render: &mut MarkdownRender,
- abort: &AbortSignal,
-) -> Result<()> {
- let mut buffer = String::new();
- let mut indent = 0;
- loop {
- if abort.aborted() {
- return Ok(());
- }
- if let Ok(evt) = rx.try_recv() {
- match evt {
- ReplyEvent::Text(text) => {
- if text.contains('\n') {
- let text = format!("{buffer}{text}");
- let (head, tail) = split_line_tail(&text);
- buffer = tail.to_string();
- let output = render.render_with_indent(head, indent);
- println!("{}", output);
- indent = 0;
- } else {
- buffer = format!("{buffer}{text}");
- if !(render.is_code()
- || buffer.len() < 40
- || buffer.starts_with('#')
- || buffer.starts_with('>')
- || buffer.starts_with('|'))
- {
- if let Some((head, remain)) = split_line_sematic(&buffer) {
- buffer = remain;
- let output = render.render_with_indent(&head, indent);
- let (_, tail) = split_line_tail(&output);
- if let Some(width) = render.wrap_width() {
- if output.contains('\n') {
- indent = display_width(tail);
- } else {
- indent += display_width(&output);
- }
- indent %= width as usize;
- }
- print!("{}", output);
- }
- }
- }
- }
- ReplyEvent::Done => {
- let output = render.render_with_indent(&buffer, indent);
- println!("{}", output);
- break;
- }
- }
- }
- }
- Ok(())
-}