From 9e8a5481cf9aa4dfd75d5c55c003b3813ccbca1e Mon Sep 17 00:00:00 2001 From: sigoden Date: Fri, 3 Mar 2023 09:15:58 +0800 Subject: feat: support save chat messages to file --- src/main.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index f3db0f4..18be063 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ mod config; +use std::fs::{File, OpenOptions}; use std::io::{stdout, Write}; use std::path::Path; use std::path::PathBuf; @@ -149,11 +150,27 @@ fn run_repl( let mut trigged_ctrlc = false; let mut output = String::new(); let mut role: Option = None; + let mut save_file: Option = if let Some(path) = &config.save_path { + let file = OpenOptions::new() + .create(true) + .append(true) + .open(path) + .map_err(|err| { + anyhow!( + "Failed to create/append save_file at {}, {err}", + path.display() + ) + })?; + Some(file) + } else { + None + }; let handle_line = |line: String, line_editor: &mut Reedline, trigged_ctrlc: &mut bool, role: &mut Option, - output: &mut String| + output: &mut String, + save_file: &mut Option| -> Result { if line.starts_with('.') { let (name, args) = match line.split_once(' ') { @@ -228,6 +245,13 @@ fn run_repl( } } }); + if !output.is_empty() { + if let Some(file) = save_file.as_mut() { + let _ = file.write_all( + format!("AICHAT: {input}\n\n--------\n{output}\n--------\n\n").as_bytes(), + ); + } + } } Ok(false) }; @@ -238,6 +262,7 @@ fn run_repl( &mut trigged_ctrlc, &mut role, &mut output, + &mut save_file, )?; } loop { @@ -250,6 +275,7 @@ fn run_repl( &mut trigged_ctrlc, &mut role, &mut output, + &mut save_file, )?; if quit { break; -- cgit v1.2.3