use std::path::PathBuf;
use anyhow::{Result, bail};
use banshee_completion::CompletionRequest;
use clap::Args;
use text_size::TextSize;
use super::io::{self, gather_inputs};
use super::{Cli, exit};
#[derive(Args, Debug)]
pub struct CompleteArgs {
paths: Vec<PathBuf>,
#[arg(long)]
offset: u32,
#[arg(long, default_value_t = 25)]
limit: usize,
}
pub fn run(args: &CompleteArgs, cli: &Cli) -> Result<u8> {
let config = cli.load_config(&io::discovery_anchor(&args.paths))?;
let inputs = gather_inputs(&args.paths)?;
let Some(input) = inputs.into_iter().next() else {
bail!("no input provided");
};
let provider = super::schema::resolve(&config)?;
let mut request = CompletionRequest::new(&input.text, TextSize::from(args.offset));
if let Some(p) = &provider {
request = request.with_schema_provider(p).with_function_provider(p);
}
let result = banshee_completion::complete(request);
if result.items.is_empty() {
println!("(no completions at offset {})", args.offset);
return Ok(exit::OK);
}
for item in result.items.iter().take(args.limit) {
let detail = item.detail.as_deref().unwrap_or("");
println!("{:<24} {:?} {}", item.label, item.kind, detail);
}
Ok(exit::OK)
}