forked from extern/nushell
03c9eaf005
In Nu we have variables (E.g. $var-name) and these contain `Value` types. This means we can bind to variables any structured data and column path syntax (E.g. `$variable.path.to`) allows flexibility for "querying" said structures. Here we offer completions for these. For example, in a Nushell session the variable `$nu` contains environment values among other things. If we wanted to see in the screen some environment variable (say the var `SHELL`) we do: ``` > echo $nu.env.SHELL ``` with completions we can now do: `echo $nu.env.S[\TAB]` and we get suggestions that start at the column path `$nu.env` with vars starting with the letter `S` in this case `SHELL` appears in the suggestions.
36 lines
1.0 KiB
Rust
36 lines
1.0 KiB
Rust
use super::matchers::Matcher;
|
|
use crate::{Completer, CompletionContext, Suggestion};
|
|
|
|
pub struct FlagCompleter {
|
|
pub(crate) cmd: String,
|
|
}
|
|
|
|
impl<Context> Completer<Context> for FlagCompleter
|
|
where
|
|
Context: CompletionContext,
|
|
{
|
|
fn complete(&self, ctx: &Context, partial: &str, matcher: &dyn Matcher) -> Vec<Suggestion> {
|
|
if let Some(sig) = ctx.signature_registry().get(&self.cmd) {
|
|
let mut suggestions = Vec::new();
|
|
for (name, (named_type, _desc)) in sig.named.iter() {
|
|
suggestions.push(format!("--{}", name));
|
|
|
|
if let Some(c) = named_type.get_short() {
|
|
suggestions.push(format!("-{}", c));
|
|
}
|
|
}
|
|
|
|
suggestions
|
|
.into_iter()
|
|
.filter(|v| matcher.matches(partial, v))
|
|
.map(|v| Suggestion {
|
|
replacement: format!("{} ", v),
|
|
display: v,
|
|
})
|
|
.collect()
|
|
} else {
|
|
Vec::new()
|
|
}
|
|
}
|
|
}
|