use clap::Parser;
use llmcc::{run_main, LlmccOptions};
use llmcc_python::LangPython;
use llmcc_rust::LangRust;
#[derive(Parser, Debug)]
#[command(name = "llmcc")]
#[command(about = "llmcc: llm context compiler")]
#[command(version)]
struct Args {
#[arg(value_name = "FILE", required_unless_present = "dir")]
files: Vec<String>,
#[arg(short, long, value_name = "DIR")]
dir: Option<String>,
#[arg(long, value_name = "LANG", default_value = "rust")]
lang: String,
#[arg(long, default_value_t = false)]
print_ir: bool,
#[arg(long, default_value_t = false)]
print_block: bool,
#[arg(long, default_value_t = false)]
project_graph: bool,
#[arg(long, default_value_t = false)]
pagerank: bool,
#[arg(long, value_name = "K", requires = "pagerank")]
top_k: Option<usize>,
#[arg(
long,
value_name = "DIR",
requires = "pagerank",
default_value = "depended-by"
)]
pagerank_direction: String,
#[arg(long, value_name = "NAME")]
query: Option<String>,
#[arg(long, default_value_t = false)]
recursive: bool,
#[arg(long, default_value_t = false, conflicts_with = "recursive")]
dependents: bool,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Args::parse();
let opts = LlmccOptions {
files: args.files,
dir: args.dir,
print_ir: args.print_ir,
print_block: args.print_block,
project_graph: args.project_graph,
pagerank: args.pagerank,
top_k: args.top_k,
pagerank_direction: args.pagerank_direction,
query: args.query,
recursive: args.recursive,
dependents: args.dependents,
};
let result = match args.lang.as_str() {
"rust" => run_main::<LangRust>(&opts),
"python" => run_main::<LangPython>(&opts),
_ => Err(format!("Unknown language: {}", args.lang).into()),
}?;
if let Some(output) = result {
println!("{}", output);
}
Ok(())
}