Skip to content

Commit f741e09

Browse files
authored
R: move Convert from SymbolResult to ArgumentResult, clean up SetDefaultValueFactory (#737)
1 parent f5ee0ab commit f741e09

File tree

6 files changed

+89
-86
lines changed

6 files changed

+89
-86
lines changed

src/System.CommandLine.Tests/ParseDiagramTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,11 @@ public void Parse_diagram_identifies_options_where_default_values_have_been_appl
8484
{
8585
new Option(new[] { "-h", "--height" })
8686
{
87-
Argument = new Argument<int>(defaultValue: () => 10), Description = ""
87+
Argument = new Argument<int>(getDefaultValue: () => 10), Description = ""
8888
},
8989
new Option(new[] { "-w", "--width" })
9090
{
91-
Argument = new Argument<int>(defaultValue: () => 15), Description = ""
91+
Argument = new Argument<int>(getDefaultValue: () => 15), Description = ""
9292
},
9393
new Option(new[] { "-c", "--color" })
9494
{

src/System.CommandLine.Tests/SuggestionTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ public void Option_substring_matching_when_arguments_have_default_values()
721721
{
722722
new Option("--implicit")
723723
{
724-
Argument = new Argument<string>(defaultValue: () => "the-default")
724+
Argument = new Argument<string>(getDefaultValue: () => "the-default")
725725
},
726726
new Option("--not")
727727
{

src/System.CommandLine/Argument.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace System.CommandLine
1111
{
1212
public class Argument : Symbol, IArgument
1313
{
14-
private Func<object> _getDefaultValue;
14+
private Func<object> _defaultValueFactory;
1515
private readonly List<string> _suggestions = new List<string>();
1616
private readonly List<ISuggestionSource> _suggestionSources = new List<ISuggestionSource>();
1717
private IArgumentArity _arity;
@@ -116,25 +116,25 @@ bool DefaultConvert(SymbolResult symbol, out object value)
116116

117117
public object GetDefaultValue()
118118
{
119-
if (_getDefaultValue is null)
119+
if (_defaultValueFactory is null)
120120
{
121121
throw new InvalidOperationException($"Argument \"{Name}\" does not have a default value");
122122
}
123123

124-
return _getDefaultValue.Invoke();
124+
return _defaultValueFactory.Invoke();
125125
}
126126

127127
public void SetDefaultValue(object value)
128128
{
129129
SetDefaultValueFactory(() => value);
130130
}
131131

132-
public void SetDefaultValueFactory(Func<object> getValue)
132+
public void SetDefaultValueFactory(Func<object> getDefaultValue)
133133
{
134-
_getDefaultValue = getValue ?? throw new ArgumentNullException(nameof(getValue));
134+
_defaultValueFactory = getDefaultValue ?? throw new ArgumentNullException(nameof(getDefaultValue));
135135
}
136136

137-
public bool HasDefaultValue => _getDefaultValue != null;
137+
public bool HasDefaultValue => _defaultValueFactory != null;
138138

139139
internal static Argument None => new Argument { Arity = ArgumentArity.Zero };
140140

@@ -178,7 +178,7 @@ internal void AddAllowedValues(IEnumerable<string> values)
178178
AllowedValues.UnionWith(values);
179179
}
180180

181-
public override IEnumerable<string> GetSuggestions(string textToMatch)
181+
public override IEnumerable<string> GetSuggestions(string textToMatch = null)
182182
{
183183
var fixedSuggestions = _suggestions;
184184

src/System.CommandLine/Argument{T}.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,22 @@ public Argument() : base(null)
2020

2121
public Argument(string name, Func<T> getDefaultValue) : this(name)
2222
{
23+
if (getDefaultValue == null)
24+
{
25+
throw new ArgumentNullException(nameof(getDefaultValue));
26+
}
27+
2328
SetDefaultValueFactory(() => getDefaultValue());
2429
}
2530

26-
public Argument(Func<T> defaultValue) : this()
31+
public Argument(Func<T> getDefaultValue) : this()
2732
{
28-
SetDefaultValueFactory(() => defaultValue());
33+
if (getDefaultValue == null)
34+
{
35+
throw new ArgumentNullException(nameof(getDefaultValue));
36+
}
37+
38+
SetDefaultValueFactory(() => getDefaultValue());
2939
}
3040

3141
public Argument(TryConvertArgument<T> convert, Func<T> getDefaultValue = default) : this()

src/System.CommandLine/Parsing/ArgumentResult.cs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,71 @@ internal ParseError CustomError(Argument argument)
3939

4040
return null;
4141
}
42+
43+
internal static ArgumentConversionResult Convert(
44+
ArgumentResult argumentResult,
45+
IArgument argument)
46+
{
47+
var parentResult = argumentResult.Parent;
48+
49+
if (ShouldCheckArity() &&
50+
ArgumentArity.Validate(parentResult,
51+
argument,
52+
argument.Arity.MinimumNumberOfValues,
53+
argument.Arity.MaximumNumberOfValues) is FailedArgumentConversionResult failedResult)
54+
{
55+
return failedResult;
56+
}
57+
58+
if (parentResult.UseDefaultValueFor(argument))
59+
{
60+
var defaultValueFor = parentResult.GetDefaultValueFor(argument);
61+
62+
return ArgumentConversionResult.Success(argument, defaultValueFor);
63+
}
64+
65+
if (argument is Argument a &&
66+
a.ConvertArguments != null)
67+
{
68+
if (argumentResult.ConversionResult != null)
69+
{
70+
return argumentResult.ConversionResult;
71+
}
72+
73+
var success = a.ConvertArguments(argumentResult, out var value);
74+
75+
if (value is ArgumentConversionResult conversionResult)
76+
{
77+
return conversionResult;
78+
}
79+
else if (success)
80+
{
81+
return ArgumentConversionResult.Success(argument, value);
82+
}
83+
else
84+
{
85+
return ArgumentConversionResult.Failure(argument, argumentResult.ErrorMessage ?? $"Invalid: {parentResult.Token} {string.Join(" ", parentResult.Tokens.Select(t => t.Value))}");
86+
}
87+
}
88+
89+
switch (argument.Arity.MaximumNumberOfValues)
90+
{
91+
case 0:
92+
return ArgumentConversionResult.Success(argument, null);
93+
94+
case 1:
95+
return ArgumentConversionResult.Success(argument, parentResult.Tokens.Select(t => t.Value).SingleOrDefault());
96+
97+
default:
98+
return ArgumentConversionResult.Success(argument, parentResult.Tokens.Select(t => t.Value).ToArray());
99+
}
100+
101+
bool ShouldCheckArity()
102+
{
103+
return !(parentResult is OptionResult optionResult &&
104+
optionResult.IsImplicit);
105+
}
106+
}
107+
42108
}
43109
}

src/System.CommandLine/Parsing/SymbolResult.cs

Lines changed: 1 addition & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
using System.Collections.Generic;
55
using System.CommandLine.Binding;
6-
using System.CommandLine.Collections;
76
using System.Linq;
87

98
namespace System.CommandLine.Parsing
@@ -50,7 +49,7 @@ internal ArgumentConversionResultSet ArgumentConversionResults
5049
{
5150
var results = Children
5251
.OfType<ArgumentResult>()
53-
.Select(r => Convert(r, r.Argument));
52+
.Select(r => ArgumentResult.Convert(r, r.Argument));
5453

5554
_results = new ArgumentConversionResultSet();
5655

@@ -136,76 +135,6 @@ internal bool UseDefaultValueFor(IArgument argument)
136135

137136
public override string ToString() => $"{GetType().Name}: {Token}";
138137

139-
internal static ArgumentConversionResult Convert(
140-
ArgumentResult argumentResult,
141-
IArgument argument) =>
142-
Convert(argumentResult.Parent, argument);
143-
144-
internal static ArgumentConversionResult Convert(
145-
SymbolResult symbolResult,
146-
IArgument argument)
147-
{
148-
if (ShouldCheckArity() &&
149-
ArgumentArity.Validate(symbolResult,
150-
argument,
151-
argument.Arity.MinimumNumberOfValues,
152-
argument.Arity.MaximumNumberOfValues) is FailedArgumentConversionResult failedResult)
153-
{
154-
return failedResult;
155-
}
156-
157-
if (symbolResult.UseDefaultValueFor(argument))
158-
{
159-
var defaultValueFor = symbolResult.GetDefaultValueFor(argument);
160-
161-
return ArgumentConversionResult.Success(argument, defaultValueFor);
162-
}
163-
164-
if (argument is Argument a &&
165-
a.ConvertArguments != null)
166-
{
167-
var argumentResult = (ArgumentResult) symbolResult.Children.ResultFor(argument);
168-
169-
if (argumentResult.ConversionResult != null)
170-
{
171-
return argumentResult.ConversionResult;
172-
}
173-
174-
var success = a.ConvertArguments(argumentResult, out var value);
175-
176-
if (value is ArgumentConversionResult conversionResult)
177-
{
178-
return conversionResult;
179-
}
180-
else if (success)
181-
{
182-
return ArgumentConversionResult.Success(argument, value);
183-
}
184-
else
185-
{
186-
return ArgumentConversionResult.Failure(argument, argumentResult.ErrorMessage ?? $"Invalid: {symbolResult.Token} {string.Join(" ", symbolResult.Tokens.Select(t => t.Value))}");
187-
}
188-
}
189-
190-
switch (argument.Arity.MaximumNumberOfValues)
191-
{
192-
case 0:
193-
return ArgumentConversionResult.Success(argument, null);
194-
195-
case 1:
196-
return ArgumentConversionResult.Success(argument, symbolResult.Tokens.Select(t => t.Value).SingleOrDefault());
197-
198-
default:
199-
return ArgumentConversionResult.Success(argument, symbolResult.Tokens.Select(t => t.Value).ToArray());
200-
}
201-
202-
bool ShouldCheckArity()
203-
{
204-
return !(symbolResult is OptionResult optionResult &&
205-
optionResult.IsImplicit);
206-
}
207-
}
208-
209138
internal ParseError UnrecognizedArgumentError(Argument argument)
210139
{
211140
if (argument.AllowedValues?.Count > 0 &&
@@ -225,7 +154,5 @@ internal ParseError UnrecognizedArgumentError(Argument argument)
225154

226155
return null;
227156
}
228-
229-
230157
}
231158
}

0 commit comments

Comments
 (0)