feat: extend `.read` to support files and messages (#242)

pull/243/head
sigoden 8 months ago committed by GitHub
parent 757c192829
commit 542dcfe6f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

7
Cargo.lock generated

@ -58,6 +58,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"serde_yaml", "serde_yaml",
"shell-words",
"simplelog", "simplelog",
"syntect", "syntect",
"textwrap", "textwrap",
@ -1653,6 +1654,12 @@ dependencies = [
"unsafe-libyaml", "unsafe-libyaml",
] ]
[[package]]
name = "shell-words"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
[[package]] [[package]]
name = "signal-hook" name = "signal-hook"
version = "0.3.17" version = "0.3.17"

@ -40,6 +40,7 @@ ansi_colours = "1.2.2"
reqwest-eventsource = "0.5.0" reqwest-eventsource = "0.5.0"
simplelog = "0.12.1" simplelog = "0.12.1"
log = "0.4.20" log = "0.4.20"
shell-words = "1.1.0"
[dependencies.reqwest] [dependencies.reqwest]
version = "0.11.14" version = "0.11.14"

@ -149,7 +149,7 @@ The Chat REPL supports:
.exit session End the current session .exit session End the current session
.set Modify the configuration parameters .set Modify the configuration parameters
.copy Copy the last reply to the clipboard .copy Copy the last reply to the clipboard
.read Import from file and submit .read Read files into the message and submit
.exit Exit the REPL .exit Exit the REPL
Type ::: to begin multi-line editing, type ::: to end it. Type ::: to begin multi-line editing, type ::: to end it.

@ -36,7 +36,7 @@ const REPL_COMMANDS: [(&str, &str); 13] = [
(".exit session", "End the current session"), (".exit session", "End the current session"),
(".set", "Modify the configuration parameters"), (".set", "Modify the configuration parameters"),
(".copy", "Copy the last reply to the clipboard"), (".copy", "Copy the last reply to the clipboard"),
(".read", "Import from file and submit"), (".read", "Read files into the message and submit"),
(".exit", "Exit the REPL"), (".exit", "Exit the REPL"),
]; ];
@ -185,15 +185,28 @@ impl Repl {
.with_context(|| "Failed to copy the last output")?; .with_context(|| "Failed to copy the last output")?;
} }
".read" => match args { ".read" => match args {
Some(file) => { Some(args) => {
let mut content = String::new(); let (files, text) = match args.split_once(" -- ") {
let mut file = Some((files, text)) => (files.trim(), text.trim()),
std::fs::File::open(file).with_context(|| "Unable to open file")?; None => (args, ""),
file.read_to_string(&mut content) };
.with_context(|| "Unable to read file")?; let files = shell_words::split(files).with_context(|| "Invalid files")?;
let mut texts = vec![];
if !text.is_empty() {
texts.push(text.to_string());
}
for file_path in files.into_iter() {
let mut text = String::new();
let mut file = std::fs::File::open(&file_path)
.with_context(|| format!("Unable to open file '{file_path}'"))?;
file.read_to_string(&mut text)
.with_context(|| format!("Unable to read file '{file_path}'"))?;
texts.push(text);
}
let content = texts.join("\n");
self.ask(&content)?; self.ask(&content)?;
} }
None => println!("Usage: .read <textfile>"), None => println!("Usage: .read <files>...[ -- <text>...]"),
}, },
".exit" => match args { ".exit" => match args {
Some("role") => { Some("role") => {

Loading…
Cancel
Save