summaryrefslogtreecommitdiffstats
path: root/src/render/cmd.rs
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2023-11-02 21:38:01 +0800
committerGitHub <noreply@github.com>2023-11-02 21:38:01 +0800
commitdce6877f5de297803a737387fef7f672593904cf (patch)
treeea59af8d7f6509b3bd5852dfc05d58085046d2dc /src/render/cmd.rs
parent16eba9baa10255c95e9d680e7f880f75b9bc03b1 (diff)
downloadaichat-dce6877f5de297803a737387fef7f672593904cf.tar.gz
refactor: optimize render (#202)
Diffstat (limited to 'src/render/cmd.rs')
-rw-r--r--src/render/cmd.rs28
1 files changed, 12 insertions, 16 deletions
diff --git a/src/render/cmd.rs b/src/render/cmd.rs
index 75768b9..e942025 100644
--- a/src/render/cmd.rs
+++ b/src/render/cmd.rs
@@ -1,6 +1,6 @@
use super::{MarkdownRender, ReplyEvent};
-use crate::utils::{spaces, split_line_sematic, split_line_tail, AbortSignal};
+use crate::utils::{split_line_sematic, split_line_tail, AbortSignal};
use anyhow::Result;
use crossbeam::channel::Receiver;
@@ -12,7 +12,7 @@ pub fn cmd_render_stream(
abort: &AbortSignal,
) -> Result<()> {
let mut buffer = String::new();
- let mut col = 0;
+ let mut indent = 0;
loop {
if abort.aborted() {
return Ok(());
@@ -24,10 +24,9 @@ pub fn cmd_render_stream(
let text = format!("{buffer}{text}");
let (head, tail) = split_line_tail(&text);
buffer = tail.to_string();
- let input = format!("{}{head}", spaces(col));
- let output = render.render(&input);
- println!("{}", &output[col..]);
- col = 0;
+ let output = render.render_with_indent(head, indent);
+ println!("{}", output);
+ indent = 0;
} else {
buffer = format!("{buffer}{text}");
if !(render.is_code()
@@ -38,16 +37,15 @@ pub fn cmd_render_stream(
{
if let Some((head, remain)) = split_line_sematic(&buffer) {
buffer = remain;
- let input = format!("{}{head}", spaces(col));
- let output = render.render(&input);
- let output = &output[col..];
- let (_, tail) = split_line_tail(output);
- if render.wrap_width().is_some() {
+ 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') {
- col = display_width(tail);
+ indent = display_width(tail);
} else {
- col += display_width(output);
+ indent += display_width(&output);
}
+ indent %= width as usize;
}
print!("{}", output);
}
@@ -55,9 +53,7 @@ pub fn cmd_render_stream(
}
}
ReplyEvent::Done => {
- let input = format!("{}{buffer}", spaces(col));
- let output = render.render(&input);
- let output = &output[col..];
+ let output = render.render_with_indent(&buffer, indent);
println!("{}", output);
break;
}