From f694a59dccef877a026c043cee236f57a93033a6 Mon Sep 17 00:00:00 2001 From: sigoden Date: Wed, 8 Mar 2023 11:58:50 +0800 Subject: refactor: replace dump with print_now! (#35) --- src/config.rs | 6 +++--- src/main.rs | 1 + src/render/cmd.rs | 8 ++++---- src/repl/handler.rs | 25 +++++++++++++++++-------- src/repl/mod.rs | 34 ++++++++++++++-------------------- src/utils.rs | 11 +++++++++-- 6 files changed, 48 insertions(+), 37 deletions(-) (limited to 'src') diff --git a/src/config.rs b/src/config.rs index 8ac99b7..21784c5 100644 --- a/src/config.rs +++ b/src/config.rs @@ -163,9 +163,9 @@ impl Config { Some(role) => { let output = format!("{}>> {}", role.name, role.prompt.trim()); self.role = Some(role); - format!("{}\n", output.trim()) + output } - None => "Error: Unknown role\n".into(), + None => "Error: Unknown role".into(), } } @@ -278,7 +278,7 @@ impl Config { let value = value.parse().with_context(|| "Invalid value")?; self.dry_run = value; } - _ => return Ok(format!("Error: Unknown key `{key}`\n")), + _ => return Ok(format!("Error: Unknown key `{key}`")), } Ok("".into()) } diff --git a/src/main.rs b/src/main.rs index 7d79b07..3fc0f09 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,7 @@ mod config; mod render; mod repl; mod term; +#[macro_use] mod utils; use std::cell::RefCell; diff --git a/src/render/cmd.rs b/src/render/cmd.rs index d349c79..5cf6957 100644 --- a/src/render/cmd.rs +++ b/src/render/cmd.rs @@ -1,6 +1,6 @@ use super::MarkdownRender; +use crate::print_now; use crate::repl::{ReplyStreamEvent, SharedAbortSignal}; -use crate::utils::dump; use anyhow::Result; use crossbeam::channel::Receiver; @@ -20,7 +20,7 @@ pub fn cmd_render_stream(rx: Receiver, abort: SharedAbortSigna 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); + print_now!("{}\n", markdown_render.render(&output)) } else { buffer = format!("{buffer}{text}"); if !(markdown_render.is_code_block() @@ -30,7 +30,7 @@ pub fn cmd_render_stream(rx: Receiver, abort: SharedAbortSigna || buffer.starts_with('|')) { if let Some((output, remain)) = split_line(&buffer) { - dump(markdown_render.render_line_stateless(&output), 0); + print_now!("{}", markdown_render.render_line_stateless(&output)); buffer = remain } } @@ -38,7 +38,7 @@ pub fn cmd_render_stream(rx: Receiver, abort: SharedAbortSigna } ReplyStreamEvent::Done => { let output = markdown_render.render(&buffer); - dump(output, 2); + print_now!("{}\n\n", output); break; } } diff --git a/src/repl/handler.rs b/src/repl/handler.rs index e971ff8..dddd531 100644 --- a/src/repl/handler.rs +++ b/src/repl/handler.rs @@ -1,7 +1,7 @@ use crate::client::ChatGptClient; use crate::config::SharedConfig; +use crate::print_now; use crate::render::render_stream; -use crate::utils::dump; use anyhow::Result; use crossbeam::channel::Sender; @@ -67,23 +67,28 @@ impl ReplCmdHandler { } ReplCmd::SetRole(name) => { let output = self.config.borrow_mut().change_role(&name); - dump(output, 1); + print_now!("{}\n\n", output.trim_end()); } ReplCmd::ClearRole => { self.config.borrow_mut().role = None; - dump("", 1); + print_now!("\n"); } ReplCmd::Prompt(prompt) => { self.config.borrow_mut().create_temp_role(&prompt); - dump("", 1); + print_now!("\n"); } ReplCmd::Info => { let output = self.config.borrow().info()?; - dump(output, 1); + print_now!("{}\n\n", output.trim_end()); } ReplCmd::UpdateConfig(input) => { let output = self.config.borrow_mut().update(&input)?; - dump(output, 1); + let output = output.trim(); + if output.is_empty() { + print_now!("\n"); + } else { + print_now!("{}\n\n", output); + } } } Ok(()) @@ -111,7 +116,7 @@ impl ReplyStreamHandler { let _ = tx.send(ReplyStreamEvent::Text(text.to_string())); } None => { - dump(text, 0); + print_now!("{}", text); } } self.buffer.push_str(text); @@ -123,7 +128,11 @@ impl ReplyStreamHandler { let _ = tx.send(ReplyStreamEvent::Done); } None => { - dump("", 2); + if self.buffer.ends_with('\n') { + print_now!("\n"); + } else { + print_now!("\n\n"); + } } } } diff --git a/src/repl/mod.rs b/src/repl/mod.rs index e08b798..69056ac 100644 --- a/src/repl/mod.rs +++ b/src/repl/mod.rs @@ -4,8 +4,8 @@ mod init; use crate::client::ChatGptClient; use crate::config::SharedConfig; +use crate::print_now; use crate::term; -use crate::utils::dump; use anyhow::{Context, Result}; use reedline::{DefaultPrompt, Reedline, Signal}; @@ -36,11 +36,8 @@ impl Repl { pub fn run(&mut self, client: ChatGptClient, config: SharedConfig) -> Result<()> { let abort = AbortSignal::new(); let handler = ReplCmdHandler::init(client, config, abort.clone())?; - dump( - format!("Welcome to aichat {}", env!("CARGO_PKG_VERSION")), - 1, - ); - dump("Type \".help\" for more information.", 1); + print_now!("Welcome to aichat {}\n", env!("CARGO_PKG_VERSION")); + print_now!("Type \".help\" for more information.\n"); let mut already_ctrlc = false; let handler = Arc::new(handler); loop { @@ -63,7 +60,7 @@ impl Repl { } Err(err) => { let err = format!("{err:?}"); - dump(err.trim(), 2); + print_now!("{}\n\n", err.trim()); } } } @@ -71,7 +68,7 @@ impl Repl { abort.set_ctrlc(); if !already_ctrlc { already_ctrlc = true; - dump("(To exit, press Ctrl+C again or Ctrl+D or type .exit)", 2); + print_now!("(To exit, press Ctrl+C again or Ctrl+D or type .exit)\n\n"); } else { break; } @@ -104,18 +101,18 @@ impl Repl { Some("history") => { let history = Box::new(self.editor.history_mut()); history.clear().with_context(|| "Failed to clear history")?; - dump("", 1); + print_now!("\n"); } Some("role") => handler.handle(ReplCmd::ClearRole)?, _ => dump_unknown_command(), }, ".history" => { self.editor.print_history()?; - dump("", 1); + print_now!("\n"); } ".role" => match args { Some(name) => handler.handle(ReplCmd::SetRole(name.to_string()))?, - None => dump("Usage: .role ", 2), + None => print_now!("Usage: .role \n\n"), }, ".info" => { handler.handle(ReplCmd::Info)?; @@ -123,7 +120,7 @@ impl Repl { ".editor" => { let mut text = args.unwrap_or_default().to_string(); if text.is_empty() { - dump("Usage: .editor { }", 2); + print_now!("Usage: .editor {{ }}\n\n"); } else { if text.starts_with('{') && text.ends_with('}') { text = text[1..text.len() - 1].to_string() @@ -137,7 +134,7 @@ impl Repl { ".prompt" => { let mut text = args.unwrap_or_default().to_string(); if text.is_empty() { - dump("Usage: .prompt { }.", 2); + print_now!("Usage: .prompt {{ }}.\n\n"); } else { if text.starts_with('{') && text.ends_with('}') { text = text[1..text.len() - 1].to_string() @@ -156,10 +153,7 @@ impl Repl { } fn dump_unknown_command() { - dump( - "Error: Unknown command. Type \".help\" for more information.", - 2, - ); + print_now!("Error: Unknown command. Type \".help\" for more information.\n\n"); } fn dump_repl_help() { @@ -168,8 +162,8 @@ fn dump_repl_help() { .map(|(name, desc, _)| format!("{name:<15} {desc}")) .collect::>() .join("\n"); - dump( - format!("{head}\n\nPress Ctrl+C to abort session, Ctrl+D to exit the REPL"), - 2, + print_now!( + "{}\n\nPress Ctrl+C to abort session, Ctrl+D to exit the REPL\n\n", + head, ); } diff --git a/src/utils.rs b/src/utils.rs index 5a18948..76f2b8f 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,8 +1,15 @@ use chrono::prelude::*; use std::io::{stdout, Write}; -pub fn dump(text: T, newlines: usize) { - print!("{}{}", text.to_string(), "\n".repeat(newlines)); +#[macro_export] +macro_rules! print_now { + ($($arg:tt)*) => { + $crate::utils::print_now(&format!($($arg)*)) + }; +} + +pub fn print_now(text: T) { + print!("{}", text.to_string()); let _ = stdout().flush(); } -- cgit v1.2.3