pub mod grammar;
mod internal;
use anyhow::Result;
use std::path::Path;
pub use internal::QuerySet;
pub struct BenchOptions {
pub query_set: String,
pub limit: usize,
pub json: bool,
pub verbose: bool,
pub rrf_k: Option<usize>,
pub fetch_multiplier: Option<usize>,
pub oracle: Option<Vec<String>>,
pub repo: Option<String>,
}
pub fn execute(options: BenchOptions) -> Result<()> {
let query_set = QuerySet::load(Path::new(&options.query_set))?;
let config =
internal::build_retrieval_config(options.rrf_k, options.fetch_multiplier, options.oracle);
internal::run_benchmark(
&query_set,
options.limit,
options.json,
options.verbose,
config,
options.repo,
)
}
pub fn execute_grammar(files: Option<usize>) -> Result<()> {
let options = grammar::GrammarBenchOptions { files };
grammar::run(options)
}
pub struct GenerateOptions {
pub repo: Option<String>,
pub limit: usize,
pub output: Option<String>,
}
pub fn generate(options: GenerateOptions) -> Result<()> {
let config = internal::GenerateConfig {
repo: options.repo,
limit: options.limit,
..Default::default()
};
let query_set = internal::generate_from_commits(config)?;
let json = serde_json::to_string_pretty(&query_set)?;
if let Some(output_path) = options.output {
std::fs::write(&output_path, &json)?;
println!(
"Generated {} queries → {}",
query_set.queries.len(),
output_path
);
} else {
println!("{}", json);
}
Ok(())
}