customize completion candidates for some args

This commit is contained in:
pedrocarlo 2025-04-04 17:39:09 -03:00
parent fd3335908c
commit 57af9c71ba
4 changed files with 36 additions and 11 deletions

View file

@ -1,6 +1,7 @@
use clap::{Args, ValueEnum};
use clap_complete::{ArgValueCompleter, CompletionCandidate, PathCompleter};
use crate::input::OutputMode;
use crate::{input::OutputMode, opcodes_dictionary::OPCODE_DESCRIPTIONS};
#[derive(Debug, Clone, Args)]
pub struct ExitArgs {
@ -12,13 +13,17 @@ pub struct ExitArgs {
#[derive(Debug, Clone, Args)]
pub struct OpenArgs {
/// Path to open database
#[arg(add = ArgValueCompleter::new(PathCompleter::file()))]
pub path: String,
// TODO see how to have this completed with the output of List Vfs function
// Currently not possible to pass arbitrary
/// Name of VFS
pub vfs_name: Option<String>,
}
#[derive(Debug, Clone, Args)]
pub struct SchemaArgs {
// TODO depends on PRAGMA table_list for completions
/// Table name to visualize schema
pub table_name: Option<String>,
}
@ -26,6 +31,7 @@ pub struct SchemaArgs {
#[derive(Debug, Clone, Args)]
pub struct SetOutputArgs {
/// File path to send output to
#[arg(add = ArgValueCompleter::new(PathCompleter::file()))]
pub path: Option<String>,
}
@ -35,15 +41,40 @@ pub struct OutputModeArgs {
pub mode: OutputMode,
}
fn opcodes_completer(current: &std::ffi::OsStr) -> Vec<CompletionCandidate> {
let mut completions = vec![];
let Some(current) = current.to_str() else {
return completions;
};
let current = current.to_lowercase();
let opcodes = &OPCODE_DESCRIPTIONS;
for op in opcodes {
// TODO if someone know how to do prefix_match with case insensitve in Rust
// without converting the String to lowercase first, please fix this.
let op_name = op.name.to_ascii_lowercase();
if op_name.starts_with(&current) {
completions.push(CompletionCandidate::new(op.name).help(Some(op.description.into())));
}
}
completions
}
#[derive(Debug, Clone, Args)]
pub struct OpcodesArgs {
/// Opcode to display description
#[arg(add = ArgValueCompleter::new(opcodes_completer))]
pub opcode: Option<String>,
}
#[derive(Debug, Clone, Args)]
pub struct CwdArgs {
/// Target directory
#[arg(add = ArgValueCompleter::new(PathCompleter::dir()))]
pub directory: String,
}
@ -72,11 +103,6 @@ pub struct TablesArgs {
#[derive(Debug, Clone, Args)]
pub struct LoadExtensionArgs {
/// Path to extension file
pub path: String,
}
#[derive(Debug, Clone, Args)]
pub struct ListVfsArgs {
/// Path to extension file
#[arg(add = ArgValueCompleter::new(PathCompleter::file()))]
pub path: String,
}

View file

@ -35,9 +35,6 @@ pub enum Command {
/// Open a database file
#[command(display_name = ".open")]
Open(OpenArgs),
/// Print this message or the help of the given subcommand(s)
// #[command(display_name = ".help")]
// Help,
/// Display schema for a table
#[command(display_name = ".schema")]
Schema(SchemaArgs),