use veks_completion::{CommandTree, Node, complete, handle_complete_env, print_bash_script};
fn complete_datasets(partial: &str, _context: &[&str]) -> Vec<String> {
let datasets = ["sift128", "glove100", "cohere768", "ada1536"];
datasets.iter()
.filter(|d| partial.is_empty() || d.starts_with(partial))
.map(|d| d.to_string())
.collect()
}
fn build_tree() -> CommandTree {
CommandTree::new("example")
.command("run", Node::leaf_with_flags(
&["--input", "--output", "--threads"],
&["--verbose", "--dry-run"],
))
.group("compute", Node::group(vec![
("knn", Node::leaf_with_flags(
&["--base", "--query", "--metric", "--dataset"],
&["--exact"],
).with_value_provider("--dataset", veks_completion::fn_provider(complete_datasets))),
("stats", Node::leaf(&["--input", "--output"])),
]))
.hidden_command("_internal", Node::leaf(&["--debug"]))
}
fn main() {
let tree = build_tree();
if handle_complete_env("example", &tree) {
return;
}
let args: Vec<String> = std::env::args().collect();
if args.get(1).map(|s| s.as_str()) == Some("completions") {
print_bash_script("example");
return;
}
println!("=== Completion Demo ===\n");
let scenarios: Vec<(&str, Vec<&str>)> = vec![
("Root commands", vec!["example", ""]),
("Compute subcommands", vec!["example", "compute", ""]),
("KNN options", vec!["example", "compute", "knn", ""]),
("--dataset values", vec!["example", "compute", "knn", "--dataset", ""]),
("--dataset prefix 'co'", vec!["example", "compute", "knn", "--dataset", "co"]),
("After consuming --base", vec!["example", "compute", "knn", "--base", "x.fvec", ""]),
];
for (label, words) in scenarios {
let candidates = complete(&tree, &words);
println!("{label}:");
println!(" input: {:?}", &words[1..]);
println!(" candidates: {candidates:?}\n");
}
}