use anyhow::Result;
use clap::Parser;
use std::path::Path;
use semtools::{LlamaParseBackend, LlamaParseConfig};
#[derive(Parser, Debug)]
#[command(version, about = "A CLI tool for parsing documents using various backends", long_about = None)]
struct Args {
#[clap(short = 'c', long)]
parse_config: Option<String>,
#[clap(short, long, default_value = "llama-parse")]
backend: String,
#[clap(required = true)]
files: Vec<String>,
#[clap(short, long)]
verbose: bool,
}
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
let config_path = args.parse_config.unwrap_or_else(|| {
dirs::home_dir()
.unwrap()
.join(".parse_config.json")
.to_string_lossy()
.to_string()
});
let config = LlamaParseConfig::from_config_file(&config_path)?;
for file in &args.files {
if !Path::new(file).exists() {
eprintln!("Warning: File does not exist: {file}");
}
}
match args.backend.as_str() {
"llama-parse" => {
let backend = LlamaParseBackend::new(config, args.verbose)?;
let results = backend.parse(args.files).await?;
for result_path in results {
println!("{result_path}");
}
}
_ => {
eprintln!(
"Error: Unknown backend '{}'. Supported backends: llama-parse",
args.backend
);
std::process::exit(1);
}
}
Ok(())
}