Short-hand flags (#1378)

* typo fixes

* Change signature to take in short-hand flags

* update help information

* Parse short-hand flags as their long counterparts

* lints

* Modified a couple tests to use shorthand flags
This commit is contained in:
Corvus Corax
2020-02-11 20:24:31 -06:00
committed by GitHub
parent 2ab8d035e6
commit c0be02a434
46 changed files with 344 additions and 110 deletions

View File

@ -183,7 +183,11 @@ fn with_empty_context(source: &Text, callback: impl FnOnce(ExpandContext)) {
SyntaxShape::Pattern,
"a path to get the directory contents from",
)
.switch("full", "list all available columns for each entry"),
.switch(
"full",
"list all available columns for each entry",
Some('f'),
),
);
callback(ExpandContext::new(Box::new(registry), source, None))

View File

@ -361,9 +361,20 @@ impl SpannedToken {
}
}
pub(crate) fn as_flag(&self, value: &str, source: &Text) -> Option<Flag> {
pub(crate) fn as_flag(&self, value: &str, short: Option<char>, source: &Text) -> Option<Flag> {
match self.unspanned() {
Token::Flag(flag @ Flag { .. }) if value == flag.name().slice(source) => Some(*flag),
Token::Flag(flag @ Flag { .. }) => {
let name = flag.name().slice(source);
let is_long = flag.kind == FlagKind::Longhand && value == name;
let is_short = flag.kind == FlagKind::Shorthand
&& short.is_some()
&& short == name.chars().nth(0);
if is_long || is_short {
Some(*flag)
} else {
None
}
}
_ => None,
}
}

View File

@ -31,8 +31,8 @@ pub fn parse_command_tail(
trace!(target: "nu::parse::trace_remaining", "looking for {} : {:?}", name, kind);
match &kind.0 {
NamedType::Switch => {
let switch = extract_switch(name, tail);
NamedType::Switch(s) => {
let switch = extract_switch(name, *s, tail);
match switch {
None => named.insert_switch(name, None),
@ -45,8 +45,8 @@ pub fn parse_command_tail(
}
}
}
NamedType::Mandatory(syntax_type) => {
match extract_mandatory(config, name, tail, command_span) {
NamedType::Mandatory(s, syntax_type) => {
match extract_mandatory(config, name, *s, tail, command_span) {
Err(err) => {
// remember this error, but continue coloring
found_error = Some(err);
@ -71,8 +71,8 @@ pub fn parse_command_tail(
}
}
}
NamedType::Optional(syntax_type) => {
match extract_optional(name, tail) {
NamedType::Optional(s, syntax_type) => {
match extract_optional(name, *s, tail) {
Err(err) => {
// remember this error, but continue coloring
found_error = Some(err);
@ -270,10 +270,14 @@ fn expand_spaced_expr<
fn extract_switch(
name: &str,
short: Option<char>,
tokens: &mut hir::TokensIterator<'_>,
) -> Option<(usize, Spanned<Flag>)> {
let source = tokens.source();
let switch = tokens.extract(|t| t.as_flag(name, &source).map(|flag| flag.spanned(t.span())));
let switch = tokens.extract(|t| {
t.as_flag(name, short, &source)
.map(|flag| flag.spanned(t.span()))
});
match switch {
None => None,
@ -287,11 +291,15 @@ fn extract_switch(
fn extract_mandatory(
config: &Signature,
name: &str,
short: Option<char>,
tokens: &mut hir::TokensIterator<'_>,
span: Span,
) -> Result<(usize, Spanned<Flag>), ParseError> {
let source = tokens.source();
let flag = tokens.extract(|t| t.as_flag(name, &source).map(|flag| flag.spanned(t.span())));
let flag = tokens.extract(|t| {
t.as_flag(name, short, &source)
.map(|flag| flag.spanned(t.span()))
});
match flag {
None => Err(ParseError::argument_error(
@ -308,10 +316,14 @@ fn extract_mandatory(
fn extract_optional(
name: &str,
short: Option<char>,
tokens: &mut hir::TokensIterator<'_>,
) -> Result<Option<(usize, Spanned<Flag>)>, ParseError> {
let source = tokens.source();
let flag = tokens.extract(|t| t.as_flag(name, &source).map(|flag| flag.spanned(t.span())));
let flag = tokens.extract(|t| {
t.as_flag(name, short, &source)
.map(|flag| flag.spanned(t.span()))
});
match flag {
None => Ok(None),