dotnet / dotnet/command-line-api

FromAmong should consider custom parsing

Open
#1,503 0 comments 0 reactions 0 assignees View on GitHub
Area-Parser and Binder bug
Dominant language
C#
Stars
3.7k
Forks
428
PR merge metrics
No merged PRs in 30d

Description

2.0.0-beta1.21601.2 breaks the following use case:
Given option:
```
internal static Option> CreateColumnsOption()
{
Option> option = new(new[] { "--columns" }, ParseCommaSeparatedValues)
{
Arity = new ArgumentArity(1, 4),
Description = LocalizableStrings.OptionDescriptionColumns,
AllowMultipleArgumentsPerToken = true,
};
option.FromAmong(
TabularOutputSettings.ColumnNames.Author,
TabularOutputSettings.ColumnNames.Language,
TabularOutputSettings.ColumnNames.Type,
TabularOutputSettings.ColumnNames.Tags);
return option;
}

internal static IReadOnlyList ParseCommaSeparatedValues(ArgumentResult result)
{
List values = new List();
foreach (var value in result.Tokens.Select(t => t.Value))
{
values.AddRange(value.Split(",", StringSplitOptions.TrimEntries).Where(s => !string.IsNullOrWhiteSpace(s)));
}
return values;
}
```
the following use cases fail:
`new list --columns author, type --columns tag`
`new list --columns author,type`

Error is:

```
System.InvalidOperationException : Argument 'author,type' not recognized. Must be one of:
'author'
'language'
'type'
'tags'

Stack Trace: 
ArgumentConverter.GetValueOrDefault[T](ArgumentConversionResult result)
OptionResult.GetValueOrDefault[T]()
ParseResult.GetValueForOption[T](Option`1 option)
GlobalArgs.ParseTabularOutputSettings(ITabularOutputCommand command, ParseResult parseResult) line 42
ListCommandArgs.ctor(BaseListCommand command, ParseResult parseResult) line 128
ListTests.List_CanParseColumns(String command, String[] expectedColumns) line 222
```

This scenario worked in 2.0.0-beta1.21561.1

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.