use clap::{Args, Parser, Subcommand};
use log::LevelFilter;
use prmpt::run_and_write; use prmpt::{
load_config,
Config,
Generator, InjectOperation, Injector, DEFAULT_CONFIG_KEY, };
use std::path::Path;
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
command: Option<Commands>,
config_name: Option<String>,
#[arg(long, global = true)]
verbose: bool,
#[arg(long, global = true)]
quiet: bool,
}
#[derive(Subcommand)]
enum Commands {
Generate(GenerateArgs),
Inject(InjectArgs),
}
#[derive(Args)]
struct GenerateArgs {
#[arg(short, long, default_value = ".")]
path: String,
#[arg(short, long)]
ignore: Vec<String>,
#[arg(long)]
docs_ignore: Vec<String>,
#[arg(short, long)]
output: Option<String>,
#[arg(long, default_value = "```")]
delimiter: String,
#[arg(long)]
language: Option<String>,
#[arg(long)]
docs_comments_only: bool,
#[arg(long)]
use_gitignore: bool,
#[arg(long)]
display_outputs: bool,
}
#[derive(Args)]
struct InjectArgs {
#[arg(short, long, default_value = "prmpt.in")]
input: String,
#[arg(short, long, default_value = ".")]
path: String,
}
fn main() {
let cli = Cli::parse();
if cli.verbose {
env_logger::builder()
.filter_level(LevelFilter::Debug)
.init();
} else if cli.quiet {
env_logger::builder()
.filter_level(LevelFilter::Error)
.init();
} else {
env_logger::builder().filter_level(LevelFilter::Warn).init();
}
match cli.command {
Some(Commands::Generate(args)) => {
let config = Config {
path: Some(args.path),
ignore: Some(args.ignore),
output: args.output,
delimiter: Some(args.delimiter),
language: args.language,
docs_comments_only: Some(args.docs_comments_only),
docs_ignore: Some(args.docs_ignore),
use_gitignore: Some(args.use_gitignore),
display_outputs: Some(args.display_outputs),
prompts: None, };
let generator = Generator;
if let Err(e) = run_and_write(&generator, &config) {
eprintln!("Error generating prompt: {e:?}"); std::process::exit(1);
}
}
Some(Commands::Inject(args)) => {
let injector = Injector;
if let Err(e) = injector.inject(Path::new(&args.input), Path::new(&args.path)) {
eprintln!("Error injecting code: {e:?}"); std::process::exit(1);
}
}
None => {
let config_to_load = cli.config_name.as_deref().unwrap_or(DEFAULT_CONFIG_KEY);
match load_config() {
Ok(configs) => {
if let Some(config) = configs.get(config_to_load) {
let generator = Generator;
if let Err(e) = run_and_write(&generator, &config.clone()) {
eprintln!(
"Error generating prompt from config '{config_to_load}': {e:?}"
);
std::process::exit(1);
}
} else {
let available_configs: Vec<String> = configs.keys().cloned().collect();
eprintln!(
"Configuration '{}' not found. Available configurations: {}",
config_to_load,
available_configs.join(", ")
);
if cli.config_name.is_none() {
eprintln!("Try running 'prmpt generate --help' for more options.");
}
std::process::exit(1);
}
}
Err(e) => {
eprintln!("Failed to load configuration: {e}");
eprintln!(
"Note: prmpt can run without a prmpt.yaml file using default settings."
);
std::process::exit(1);
}
}
}
}
}