Skip to content

Commit 13732af

Browse files
committed
* Reduce duplicated code
1 parent 67d7409 commit 13732af

File tree

6 files changed

+71
-83
lines changed

6 files changed

+71
-83
lines changed

src/FlowCommandLine/CommandLine.cs

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public async Task<FlowCommandResult> RunCommandAsync () {
115115
};
116116
}
117117

118-
ParseParameters ( parts, out var command, out var parameters, out var defaultParameter );
118+
ParseParameters ( parts, out var command, out var parameters, out var defaultParameter, asCommand: true );
119119

120120
try {
121121
if ( m_commands.TryGetValue ( command, out var flowCommand ) ) {
@@ -174,7 +174,7 @@ public FlowCommandResult RunCommand () {
174174
};
175175
}
176176

177-
ParseParameters ( parts, out var command, out var parameters, out var defaultParameter );
177+
ParseParameters ( parts, out var command, out var parameters, out var defaultParameter, asCommand: true );
178178

179179
try {
180180
if ( m_commands.TryGetValue ( command, out var flowCommand ) ) {
@@ -234,7 +234,7 @@ public CommandLine AddOptions ( IEnumerable<FlowCommandParameter> parameters ) {
234234
return default;
235235
}
236236

237-
ParseOptionParameters ( parts, out var parameters, out var defaultParameter );
237+
ParseParameters ( parts, out var command, out var parameters, out var defaultParameter, false );
238238

239239
var flowOptions = new FlowOptions<T> {
240240
Parameters = m_options
@@ -423,12 +423,20 @@ private List<string> GetParts () {
423423

424424
private bool IsHelpParameter ( string part ) => part is "-h" or "--help";
425425

426-
public static void ParseParameters ( List<string> parts, out string command, out Dictionary<string, string> parameters, out string defaultParameter ) {
427-
command = parts.First ().ToLowerInvariant ();
428-
var isHaveDefaultParameter = parts.Count > 1 && !parts.ElementAt ( 1 ).StartsWith ( "-" );
429-
defaultParameter = isHaveDefaultParameter ? parts.ElementAt ( 1 ) : "";
430-
parameters = parts
431-
.Skip ( isHaveDefaultParameter ? 2 : 1 )
426+
public static void ParseParameters ( List<string> parts, out string command, out Dictionary<string, string> parameters, out string defaultParameter, bool asCommand ) {
427+
var innerParts = parts.ToList();
428+
if ( asCommand ) {
429+
command = innerParts.First ().ToLowerInvariant ();
430+
innerParts.RemoveAt ( 0 );
431+
} else {
432+
command = "";
433+
}
434+
435+
var isHaveDefaultParameter = innerParts.Count > 0 && !innerParts.ElementAt ( 0 ).StartsWith ( "-" );
436+
defaultParameter = isHaveDefaultParameter ? innerParts.ElementAt ( 0 ) : "";
437+
438+
parameters = innerParts
439+
.Skip ( isHaveDefaultParameter ? 1 : 0 )
432440
.Where ( a => ( a.StartsWith ( "-" ) && a.Length > 1 ) || ( a.StartsWith ( "--" ) && a.Length > 2 ) )
433441
.Select (
434442
a => {
@@ -442,21 +450,6 @@ public static void ParseParameters ( List<string> parts, out string command, out
442450
.ToDictionary ( a => a.Name, a => a.Value );
443451
}
444452

445-
private static void ParseOptionParameters ( List<string> parts, out Dictionary<string, string> parameters, out string defaultParameter ) {
446-
var isHaveDefaultParameter = parts.Count > 1 && !parts.ElementAt ( 0 ).StartsWith ( "-" );
447-
defaultParameter = isHaveDefaultParameter ? parts.ElementAt ( 0 ) : "";
448-
parameters = parts
449-
.Skip( isHaveDefaultParameter ? 1 : 0 )
450-
.Where ( a => ( a.StartsWith ( "-" ) && a.Length > 1 ) || ( a.StartsWith ( "--" ) && a.Length > 2 ) )
451-
.Select (
452-
a => {
453-
var pair = a.StartsWith ( "--" ) ? a.Substring ( 2 ).Split ( "=" ) : a.Substring ( 1 ).Split ( "=" );
454-
return new { Name = pair[0], Value = pair.Length > 1 ? pair[1] : "" };
455-
}
456-
)
457-
.ToDictionary ( a => a.Name, a => a.Value );
458-
}
459-
460453
public static CommandLine Console () => new CommandLine ( new ConsoleCommandLineProvider () );
461454

462455
}

src/FlowCommandLine/FlowAsyncCommand.cs

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,8 @@ public T MapParametersToType ( Dictionary<string, string> values, ICommandLinePr
1313

1414
var properties = resultType
1515
.GetProperties ( BindingFlags.Public | BindingFlags.Instance );
16-
var parameters = FlowPropertyMapper.ParametersToDictionary ( Parameters );
1716

18-
FlowPropertyMapper.FillDefaultParameter ( Parameters, defaultParameterValue, commandLineProvider, properties, result );
19-
20-
var processedParameters = new HashSet<FlowCommandParameter> ();
21-
22-
foreach ( var parameter in parameters ) {
23-
var property = FlowPropertyMapper.GetPropertyFromParameter ( parameter.Value, properties );
24-
if ( property == null ) continue;
25-
if ( processedParameters.Contains ( parameter.Value ) ) continue;
26-
27-
var isProcessed = FlowPropertyMapper.SetPropertyValue ( property.PropertyType, values, parameter.Key, result, property );
28-
if ( isProcessed ) processedParameters.Add ( parameter.Value );
29-
}
30-
31-
var requiredParameters = Parameters.Where ( a => a.Required ).ToList ();
32-
if ( requiredParameters.Intersect ( processedParameters ).Count () != requiredParameters.Count ) {
33-
commandLineProvider.WriteLine ( "Not all required parameters is defined!" );
34-
throw new Exception ( "Not all required parameters is defined!" );
35-
}
17+
FlowPropertyMapper.MapParametersToType ( result, properties, Parameters, defaultParameterValue, commandLineProvider, values );
3618

3719
return result;
3820
}

src/FlowCommandLine/FlowCommand.cs

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,8 @@ public T MapParametersToType ( Dictionary<string, string> values, ICommandLinePr
1313

1414
var properties = resultType
1515
.GetProperties ( BindingFlags.Public | BindingFlags.Instance );
16-
var parameters = FlowPropertyMapper.ParametersToDictionary ( Parameters );
1716

18-
FlowPropertyMapper.FillDefaultParameter ( Parameters, defaultParameterValue, commandLineProvider, properties, result );
19-
20-
var processedParameters = new HashSet<FlowCommandParameter> ();
21-
22-
foreach ( var parameter in parameters ) {
23-
var property = FlowPropertyMapper.GetPropertyFromParameter ( parameter.Value, properties );
24-
if ( property == null ) continue;
25-
if ( processedParameters.Contains ( parameter.Value ) ) continue;
26-
27-
var isProcessed = FlowPropertyMapper.SetPropertyValue ( property.PropertyType, values, parameter.Key, result, property );
28-
if ( isProcessed ) processedParameters.Add ( parameter.Value );
29-
}
30-
31-
var requiredParameters = Parameters.Where ( a => a.Required && !a.Default ).ToList ();
32-
if ( requiredParameters.Intersect ( processedParameters ).Count () != requiredParameters.Count ) {
33-
commandLineProvider.WriteLine ( "Not all required parameters is defined!" );
34-
throw new Exception ( "Not all required parameters is defined!" );
35-
}
17+
FlowPropertyMapper.MapParametersToType ( result, properties, Parameters, defaultParameterValue, commandLineProvider, values );
3618

3719
return result;
3820
}

src/FlowCommandLine/FlowOptions.cs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,7 @@ public T MapParametersToType ( Dictionary<string, string> values, ICommandLinePr
1414
var properties = resultType
1515
.GetProperties ( BindingFlags.Public | BindingFlags.Instance );
1616

17-
var parameters = FlowPropertyMapper.ParametersToDictionary ( Parameters );
18-
19-
FlowPropertyMapper.FillDefaultParameter ( Parameters, defaultParameterValue, commandLineProvider, properties, result );
20-
21-
var processedParameters = new HashSet<FlowCommandParameter> ();
22-
23-
foreach ( var parameter in parameters ) {
24-
var property = FlowPropertyMapper.GetPropertyFromParameter ( parameter.Value, properties );
25-
if ( property == null ) continue;
26-
if ( processedParameters.Contains ( parameter.Value ) ) continue;
27-
28-
var isProcessed = FlowPropertyMapper.SetPropertyValue ( property.PropertyType, values, parameter.Key, result, property );
29-
if ( isProcessed ) processedParameters.Add ( parameter.Value );
30-
}
31-
32-
var requiredParameters = Parameters.Where ( a => a.Required && !a.Default ).ToList ();
33-
if ( requiredParameters.Intersect ( processedParameters ).Count () != requiredParameters.Count ) {
34-
commandLineProvider.WriteLine ( "Not all required options is defined!" );
35-
throw new Exception ( "Not all required options is defined!" );
36-
}
17+
FlowPropertyMapper.MapParametersToType ( result, properties, Parameters, defaultParameterValue, commandLineProvider, values );
3718

3819
return result;
3920
}

src/FlowCommandLine/FlowPropertyMapper.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,29 @@ public static Dictionary<string, FlowCommandParameter> ParametersToDictionary (
2727
return result;
2828
}
2929

30+
public static void MapParametersToType<T> ( T result, IEnumerable<PropertyInfo> properties, IEnumerable<FlowCommandParameter> flowParameters, string defaultParameterValue, ICommandLineProvider commandLineProvider, Dictionary<string, string> values ) {
31+
var parameters = ParametersToDictionary ( flowParameters );
32+
33+
FillDefaultParameter ( flowParameters, defaultParameterValue, commandLineProvider, properties, result );
34+
35+
var processedParameters = new HashSet<FlowCommandParameter> ();
36+
37+
foreach ( var parameter in parameters ) {
38+
var property = GetPropertyFromParameter ( parameter.Value, properties );
39+
if ( property == null ) continue;
40+
if ( processedParameters.Contains ( parameter.Value ) ) continue;
41+
42+
var isProcessed = SetPropertyValue ( property.PropertyType, values, parameter.Key, result, property );
43+
if ( isProcessed ) processedParameters.Add ( parameter.Value );
44+
}
45+
46+
var requiredParameters = flowParameters.Where ( a => a.Required && !a.Default ).ToList ();
47+
if ( requiredParameters.Intersect ( processedParameters ).Count () != requiredParameters.Count ) {
48+
commandLineProvider.WriteLine ( "Not all required parameters is defined!" );
49+
throw new Exception ( "Not all required parameters is defined!" );
50+
}
51+
}
52+
3053
public static void FillDefaultParameter<T> ( IEnumerable<FlowCommandParameter> parameters, string defaultParameterValue, ICommandLineProvider commandLineProvider, IEnumerable<PropertyInfo> properties, T model ) {
3154
var defaultParameter = parameters.Where ( a => a.Default ).FirstOrDefault ();
3255
if ( defaultParameter != null ) {

src/FlowCommandLineTests/CommandLineUnitTests.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1307,7 +1307,7 @@ public void ParseParameters_Success_DefaultParameter_OnlyDefault () {
13071307
List<string> parts = ["command", "defaultValue"];
13081308

13091309
//act
1310-
CommandLine.ParseParameters ( parts, out var command, out var parameters, out var defaultParameter );
1310+
CommandLine.ParseParameters ( parts, out var command, out var parameters, out var defaultParameter, asCommand: true );
13111311

13121312
//assert
13131313
Assert.Equal ( "command", command );
@@ -1389,6 +1389,33 @@ public void RunOptions_Success_DefaultParameter () {
13891389
Assert.Equal ( 895.450M, result.Parameter5.End );
13901390
}
13911391

1392+
[Fact]
1393+
public void RunOptions_Success_DefaultParameter_NotFilled () {
1394+
//arrange
1395+
var messages = new List<string> ();
1396+
var fakeProvider = A.Fake<ICommandLineProvider> ();
1397+
A.CallTo ( () => fakeProvider.GetCommandLine () ).Returns ( "--parameter1=235.30 --parameter2=- --parameter3=-100.30 --parameter4=178.56-" );
1398+
A.CallTo ( () => fakeProvider.WriteLine ( A<string>._ ) ).Invokes ( ( string fake ) => { messages.Add ( fake ); } );
1399+
var commandLine = new CommandLine ( fakeProvider );
1400+
1401+
//act and assert
1402+
var exception = Assert.Throws<Exception> ( () => {
1403+
var result = commandLine
1404+
.Application ( "TestApplication", "1.0.0" )
1405+
.AddOptions (
1406+
[
1407+
FlowCommandParameter.Create(name: "Parameter1"),
1408+
FlowCommandParameter.Create(name: "Parameter2"),
1409+
FlowCommandParameter.Create(name: "Parameter3"),
1410+
FlowCommandParameter.Create(name: "Parameter4"),
1411+
FlowCommandParameter.CreateDefault(name: "Parameter5"),
1412+
]
1413+
)
1414+
.RunOptions<RunOptions_Success_RangeDecimalParameter_Class> ();
1415+
} );
1416+
Assert.Equal ( "Not all required parameters is defined!", exception.Message );
1417+
}
1418+
13921419
}
13931420

13941421
}

0 commit comments

Comments
 (0)