Skip to content

Commit 7e97d78

Browse files
authored
Merge pull request #793 from jonsequitur/fix-792
Fix #792
2 parents ce15a91 + 7a651b0 commit 7e97d78

File tree

4 files changed

+52
-39
lines changed

4 files changed

+52
-39
lines changed

src/System.CommandLine.Tests/ParserTests.MultipleArguments.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,35 @@ public void When_multiple_arguments_are_present_then_their_order_relative_to_sib
119119
.Should()
120120
.BeTrue();
121121
}
122+
123+
[Fact]
124+
public void Multiple_arguments_of_unspecified_type_are_parsed_correctly()
125+
{
126+
var root = new RootCommand
127+
{
128+
new Argument("source")
129+
{
130+
Arity = ArgumentArity.ExactlyOne
131+
},
132+
new Argument("destination")
133+
{
134+
Arity = ArgumentArity.ExactlyOne
135+
}
136+
};
137+
138+
var result = root.Parse("src.txt", "dest.txt");
139+
140+
result.RootCommandResult
141+
.GetArgumentValueOrDefault("source")
142+
.Should()
143+
.Be("src.txt");
144+
145+
result.RootCommandResult
146+
.GetArgumentValueOrDefault("destination")
147+
.Should()
148+
.Be("dest.txt");
149+
}
150+
122151
}
123152
}
124153
}

src/System.CommandLine/ArgumentArity.cs

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,34 +30,18 @@ public ArgumentArity(int minimumNumberOfValues, int maximumNumberOfValues)
3030

3131
public int MaximumNumberOfValues { get; set; }
3232

33-
internal static FailedArgumentConversionArityResult Validate(
34-
ArgumentResult argumentResult) =>
35-
Validate(argumentResult.Parent,
36-
argumentResult.Argument,
37-
argumentResult.Argument.Arity.MinimumNumberOfValues,
38-
argumentResult.Argument.Arity.MaximumNumberOfValues);
39-
4033
internal static FailedArgumentConversionArityResult Validate(
4134
SymbolResult symbolResult,
4235
IArgument argument,
4336
int minimumNumberOfValues,
4437
int maximumNumberOfValues)
4538
{
46-
SymbolResult argumentResult = null;
47-
48-
switch (symbolResult)
39+
var argumentResult = symbolResult switch
4940
{
50-
case CommandResult commandResult:
51-
argumentResult = commandResult.Root.FindResultFor(argument);
52-
break;
53-
54-
case OptionResult optionResult:
55-
argumentResult = optionResult.Children.ResultFor(argument);
56-
break;
57-
58-
case ArgumentResult _:
59-
throw new ArgumentException("");
60-
}
41+
CommandResult commandResult => commandResult.Root.FindResultFor(argument),
42+
OptionResult optionResult => optionResult.Children.ResultFor(argument),
43+
_ => symbolResult
44+
};
6145

6246
var tokenCount = argumentResult?.Tokens.Count ?? 0;
6347

src/System.CommandLine/Parsing/ArgumentResult.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,15 @@ internal virtual ArgumentConversionResult Convert(
7474
{
7575
return conversionResult;
7676
}
77-
else if (success)
77+
78+
if (success)
7879
{
7980
return ArgumentConversionResult.Success(argument, value);
8081
}
81-
else
82-
{
83-
return ArgumentConversionResult.Failure(argument, ErrorMessage ?? $"Invalid: {parentResult.Token()} {string.Join(" ", parentResult.Tokens.Select(t => t.Value))}");
84-
}
82+
83+
return ArgumentConversionResult.Failure(
84+
argument,
85+
ErrorMessage ?? $"Invalid: {parentResult.Token()} {string.Join(" ", Tokens.Select(t => t.Value))}");
8586
}
8687

8788
switch (argument.Arity.MaximumNumberOfValues)
@@ -90,10 +91,14 @@ internal virtual ArgumentConversionResult Convert(
9091
return ArgumentConversionResult.Success(argument, null);
9192

9293
case 1:
93-
return ArgumentConversionResult.Success(argument, parentResult.Tokens.Select(t => t.Value).SingleOrDefault());
94+
return ArgumentConversionResult.Success(
95+
argument,
96+
Tokens.Select(t => t.Value).SingleOrDefault());
9497

9598
default:
96-
return ArgumentConversionResult.Success(argument, parentResult.Tokens.Select(t => t.Value).ToArray());
99+
return ArgumentConversionResult.Success(
100+
argument,
101+
Tokens.Select(t => t.Value).ToArray());
97102
}
98103

99104
bool ShouldCheckArity()

src/System.CommandLine/Parsing/SymbolResultExtensions.cs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,12 @@ internal static IEnumerable<SymbolResult> AllSymbolResults(this SymbolResult sym
2424
}
2525
}
2626

27-
internal static Token Token(this SymbolResult symbolResult)
28-
{
29-
switch (symbolResult)
27+
internal static Token Token(this SymbolResult symbolResult) =>
28+
symbolResult switch
3029
{
31-
case CommandResult commandResult:
32-
return commandResult.Token;
33-
case OptionResult optionResult:
34-
return optionResult.Token;
35-
default:
36-
throw new ArgumentOutOfRangeException(nameof(symbolResult));
37-
}
38-
}
30+
CommandResult commandResult => commandResult.Token,
31+
OptionResult optionResult => optionResult.Token,
32+
_ => throw new ArgumentOutOfRangeException(nameof(symbolResult))
33+
};
3934
}
4035
}

0 commit comments

Comments
 (0)