mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-08-03 17:48:17 +00:00
customize completion candidates for some args
This commit is contained in:
parent
fd3335908c
commit
57af9c71ba
4 changed files with 36 additions and 11 deletions
|
@ -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(¤t) {
|
||||
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,
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue