summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs41
1 files changed, 15 insertions, 26 deletions
diff --git a/src/main.rs b/src/main.rs
index 056133c..48eb2b9 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -17,8 +17,8 @@ use crate::client::{
call_chat_completions, call_chat_completions_streaming, list_models, ModelType,
};
use crate::config::{
- ensure_parent_exists, list_agents, load_env_file, Config, GlobalConfig, Input, WorkingMode,
- CODE_ROLE, EXPLAIN_SHELL_ROLE, SHELL_ROLE, TEMP_SESSION_NAME,
+ ensure_parent_exists, list_agents, load_env_file, macro_execute, Config, GlobalConfig, Input,
+ WorkingMode, CODE_ROLE, EXPLAIN_SHELL_ROLE, SHELL_ROLE, TEMP_SESSION_NAME,
};
use crate::render::render_error;
use crate::repl::Repl;
@@ -31,19 +31,13 @@ use inquire::Text;
use is_terminal::IsTerminal;
use parking_lot::RwLock;
use simplelog::{format_description, ConfigBuilder, LevelFilter, SimpleLogger, WriteLogger};
-use std::{
- env,
- io::{stdin, Read},
- process,
- sync::Arc,
-};
+use std::{env, io::stdin, process, sync::Arc};
#[tokio::main]
async fn main() -> Result<()> {
load_env_file()?;
let cli = Cli::parse();
- let text = cli.text();
- let text = aggregate_text(text)?;
+ let text = cli.text()?;
let working_mode = if cli.serve.is_some() {
WorkingMode::Serve
} else if text.is_none() && cli.file.is_empty() {
@@ -67,7 +61,7 @@ async fn run(config: GlobalConfig, cli: Cli, text: Option<String>) -> Result<()>
return serve::run(config, addr).await;
}
if cli.info {
- config.write().cli_info_flag = true;
+ config.write().info_flag = true;
}
if cli.list_models {
@@ -91,6 +85,12 @@ async fn run(config: GlobalConfig, cli: Cli, text: Option<String>) -> Result<()>
println!("{rags}");
return Ok(());
}
+ if cli.list_macros {
+ let macros = Config::list_macros().join("\n");
+ println!("{macros}");
+ return Ok(());
+ }
+
if cli.dry_run {
config.write().dry_run = true;
}
@@ -158,6 +158,10 @@ async fn run(config: GlobalConfig, cli: Cli, text: Option<String>) -> Result<()>
return Ok(());
}
}
+ if let Some(name) = &cli.macro_name {
+ macro_execute(&config, name, text.as_deref(), abort_signal.clone()).await?;
+ return Ok(());
+ }
if cli.execute && !is_repl {
if cfg!(target_os = "macos") && !stdin().is_terminal() {
bail!("Unable to read the pipe for shell execution on MacOS")
@@ -318,21 +322,6 @@ async fn shell_execute(
Ok(())
}
-fn aggregate_text(text: Option<String>) -> Result<Option<String>> {
- let text = if stdin().is_terminal() {
- text
- } else {
- let mut stdin_text = String::new();
- stdin().read_to_string(&mut stdin_text)?;
- if let Some(text) = text {
- Some(format!("{text}\n{stdin_text}"))
- } else {
- Some(stdin_text)
- }
- };
- Ok(text)
-}
-
async fn create_input(
config: &GlobalConfig,
text: Option<String>,