Skip to main content

sqlite_graphrag/commands/
completions.rs

1//! Shell completion script generation.
2
3use clap::CommandFactory;
4use clap_complete::{generate, Shell};
5
6use crate::cli_db_noop::DbNoopArgs;
7
8/// Completions args.
9#[derive(clap::Args, Debug)]
10pub struct CompletionsArgs {
11    /// Shell to generate completions for
12    #[arg(value_enum)]
13    pub shell: Shell,
14    /// GAP-SG-139: accepted as a no-op for agent uniformity (no graph I/O).
15    #[command(flatten)]
16    pub db_noop: DbNoopArgs,
17}
18
19/// Run.
20pub fn run(args: CompletionsArgs) -> Result<(), crate::errors::AppError> {
21    args.db_noop.ignore();
22    let mut cmd = crate::cli::Cli::command();
23    let bin_name = cmd.get_name().to_string();
24    generate(args.shell, &mut cmd, bin_name, &mut std::io::stdout());
25    Ok(())
26}
27
28#[cfg(test)]
29mod tests {
30    use clap::Parser;
31
32    #[test]
33    fn completions_accepts_db_as_noop() {
34        let cli = crate::cli::Cli::try_parse_from([
35            "sqlite-graphrag",
36            "completions",
37            "bash",
38            "--db",
39            "/tmp/gap-sg-139-sentinel.sqlite",
40        ])
41        .expect("completions must accept --db as a no-op (GAP-SG-139)");
42
43        match cli.command {
44            Some(crate::cli::Commands::Completions(args)) => {
45                assert_eq!(
46                    args.db_noop.db.as_deref(),
47                    Some("/tmp/gap-sg-139-sentinel.sqlite")
48                );
49            }
50            other => panic!("expected Completions, got {other:?}"),
51        }
52    }
53}