1
1
using System ;
2
2
using System . Collections . Generic ;
3
- using System . Diagnostics ;
4
3
using System . Linq ;
5
4
6
5
namespace netmockery
@@ -12,7 +11,6 @@ static public class CommandLineParser
12
11
public const string COMMAND_DUMP = "dump" ;
13
12
public const string COMMAND_DUMPREFS = "dumprefs" ;
14
13
15
- private const string VALUE_SWITCH_COMMAND = "--command" ;
16
14
private const string VALUE_SWITCH_ENDPOINTS = "--endpoints" ;
17
15
private const string VALUE_SWITCH_URLS = "--urls" ;
18
16
private const string VALUE_SWITCH_ONLY = "--only" ;
@@ -27,20 +25,22 @@ static public class CommandLineParser
27
25
private const string BOOL_SWITCH_DIFF = "--diff" ;
28
26
private const string BOOL_SWITCH_LIST = "--list" ;
29
27
30
- static private string [ ] COMMAND_VALUES = new [ ] { COMMAND_WEB , COMMAND_TEST , COMMAND_DUMP , COMMAND_DUMPREFS } ;
31
- static private string [ ] VALUE_SWITCHES = new [ ] { VALUE_SWITCH_COMMAND , VALUE_SWITCH_ENDPOINTS , VALUE_SWITCH_URLS , VALUE_SWITCH_ONLY , VALUE_UT_SWITCH_ENVIRONMENT , VALUE_UT_SWITCH_CONTENTROOT , VALUE_UT_SWITCH_APPLICATIONNAME } ;
28
+ static private string [ ] VALUE_SWITCHES = new [ ] { VALUE_SWITCH_ENDPOINTS , VALUE_SWITCH_URLS , VALUE_SWITCH_ONLY , VALUE_UT_SWITCH_ENVIRONMENT , VALUE_UT_SWITCH_CONTENTROOT , VALUE_UT_SWITCH_APPLICATIONNAME } ;
32
29
static private string [ ] BOOL_SWITCHES = new [ ] { BOOL_SWITCH_SHOWRESPONSE , BOOL_SWITCH_NOTESTMODE , BOOL_SWITCH_STOP , BOOL_SWITCH_DIFF , BOOL_SWITCH_LIST } ;
33
30
34
31
static private Dictionary < string , string [ ] > VALID_SWITHCES_BY_COMMAND = new Dictionary < string , string [ ] > {
35
32
36
- { COMMAND_WEB , new [ ] { VALUE_SWITCH_COMMAND , VALUE_SWITCH_ENDPOINTS , VALUE_SWITCH_URLS , BOOL_SWITCH_NOTESTMODE , VALUE_UT_SWITCH_ENVIRONMENT , VALUE_UT_SWITCH_CONTENTROOT , VALUE_UT_SWITCH_APPLICATIONNAME } } ,
37
- { COMMAND_TEST , new [ ] { VALUE_SWITCH_COMMAND , VALUE_SWITCH_ENDPOINTS , VALUE_SWITCH_URLS , VALUE_SWITCH_ONLY , BOOL_SWITCH_SHOWRESPONSE , BOOL_SWITCH_STOP , BOOL_SWITCH_DIFF , BOOL_SWITCH_LIST } } ,
38
- { COMMAND_DUMP , new [ ] { VALUE_SWITCH_COMMAND , VALUE_SWITCH_ENDPOINTS } } ,
39
- { COMMAND_DUMPREFS , new [ ] { VALUE_SWITCH_COMMAND , VALUE_SWITCH_ENDPOINTS } }
33
+ { COMMAND_WEB , new [ ] { VALUE_SWITCH_ENDPOINTS , VALUE_SWITCH_URLS , BOOL_SWITCH_NOTESTMODE , VALUE_UT_SWITCH_ENVIRONMENT , VALUE_UT_SWITCH_CONTENTROOT , VALUE_UT_SWITCH_APPLICATIONNAME } } ,
34
+ { COMMAND_TEST , new [ ] { VALUE_SWITCH_ENDPOINTS , VALUE_SWITCH_URLS , VALUE_SWITCH_ONLY , BOOL_SWITCH_SHOWRESPONSE , BOOL_SWITCH_STOP , BOOL_SWITCH_DIFF , BOOL_SWITCH_LIST } } ,
35
+ { COMMAND_DUMP , new [ ] { VALUE_SWITCH_ENDPOINTS } } ,
36
+ { COMMAND_DUMPREFS , new [ ] { VALUE_SWITCH_ENDPOINTS } }
40
37
} ;
41
38
42
39
static public ParsedCommandLine ParseArguments ( string [ ] args )
43
40
{
41
+ if ( args . Length == 0 )
42
+ throw new CommandLineParsingException ( "No arguments" ) ;
43
+
44
44
// Technical debt to support multiple arg input formats, should refactor argument parsing to something standard like System.CommandLine
45
45
// key=value is converted to [key, value]
46
46
args = args
@@ -50,18 +50,70 @@ static public ParsedCommandLine ParseArguments(string[] args)
50
50
. ToArray ( ) ;
51
51
52
52
// Parsing
53
+ ( var command , args ) = ParseCommand ( args ) ;
54
+ ( var stringSwiches , var boolSwitches ) = ParseSwitches ( command , args ) ;
55
+
56
+ // Return
57
+ return new ParsedCommandLine
58
+ {
59
+ Command = command ,
60
+ Endpoints = stringSwiches [ VALUE_SWITCH_ENDPOINTS ] ,
61
+
62
+ Urls = stringSwiches [ VALUE_SWITCH_URLS ] ,
63
+ Only = stringSwiches [ VALUE_SWITCH_ONLY ] ,
64
+
65
+ ShowResponse = boolSwitches [ BOOL_SWITCH_SHOWRESPONSE ] ,
66
+ NoTestMode = boolSwitches [ BOOL_SWITCH_NOTESTMODE ] ,
67
+ Stop = boolSwitches [ BOOL_SWITCH_STOP ] ,
68
+ Diff = boolSwitches [ BOOL_SWITCH_DIFF ] ,
69
+ List = boolSwitches [ BOOL_SWITCH_LIST ]
70
+ } ;
71
+ }
72
+
73
+ static private ( string Command , string [ ] RemaingArgs ) ParseCommand ( string [ ] args )
74
+ {
75
+ string first = args . First ( ) ;
76
+
77
+ if ( first == COMMAND_WEB )
78
+ {
79
+ return ( COMMAND_WEB , args . Skip ( 1 ) . ToArray ( ) ) ;
80
+ }
81
+ else if ( first == COMMAND_TEST )
82
+ {
83
+ return ( COMMAND_TEST , args . Skip ( 1 ) . ToArray ( ) ) ;
84
+ }
85
+ else if ( first == COMMAND_DUMP )
86
+ {
87
+ return ( COMMAND_DUMP , args . Skip ( 1 ) . ToArray ( ) ) ;
88
+ }
89
+ else if ( first == COMMAND_DUMPREFS )
90
+ {
91
+ return ( COMMAND_DUMPREFS , args . Skip ( 1 ) . ToArray ( ) ) ;
92
+ }
93
+ else if ( ! first . StartsWith ( "--" ) )
94
+ {
95
+ throw new CommandLineParsingException ( $ "Unknown command '{ first } '") ;
96
+ }
97
+ else
98
+ {
99
+ return ( COMMAND_WEB , args . ToArray ( ) ) ;
100
+ }
101
+ }
102
+
103
+ static private ( Dictionary < string , string > StringSwitches , Dictionary < string , bool > BoolSwitches ) ParseSwitches ( string command , string [ ] args )
104
+ {
53
105
var seenSwitches = new List < string > ( ) ;
54
- var switchValues = new Dictionary < string , string > ( ) ;
55
- var boolValues = new Dictionary < string , bool > ( ) ;
106
+ var stringSwitch = new Dictionary < string , string > ( ) ;
107
+ var boolSwitches = new Dictionary < string , bool > ( ) ;
56
108
57
109
foreach ( var valueSwitch in VALUE_SWITCHES )
58
110
{
59
- switchValues [ valueSwitch ] = null ;
111
+ stringSwitch [ valueSwitch ] = null ;
60
112
}
61
113
62
114
foreach ( var boolSwitch in BOOL_SWITCHES )
63
115
{
64
- boolValues [ boolSwitch ] = false ;
116
+ boolSwitches [ boolSwitch ] = false ;
65
117
}
66
118
67
119
var i = 0 ;
@@ -71,12 +123,12 @@ static public ParsedCommandLine ParseArguments(string[] args)
71
123
if ( VALUE_SWITCHES . Contains ( arg ) )
72
124
{
73
125
var value = args [ ++ i ] ;
74
- switchValues [ arg ] = value ;
126
+ stringSwitch [ arg ] = value ;
75
127
seenSwitches . Add ( arg ) ;
76
128
}
77
129
else if ( BOOL_SWITCHES . Contains ( arg ) )
78
130
{
79
- boolValues [ arg ] = true ;
131
+ boolSwitches [ arg ] = true ;
80
132
seenSwitches . Add ( arg ) ;
81
133
}
82
134
else if ( arg . StartsWith ( "--" ) )
@@ -91,16 +143,9 @@ static public ParsedCommandLine ParseArguments(string[] args)
91
143
}
92
144
93
145
// Validation
94
- if ( switchValues [ VALUE_SWITCH_COMMAND ] == null )
95
- throw new CommandLineParsingException ( $ "Missing required switch { VALUE_SWITCH_COMMAND } ") ;
96
- if ( switchValues [ VALUE_SWITCH_ENDPOINTS ] == null )
146
+ if ( stringSwitch [ VALUE_SWITCH_ENDPOINTS ] == null )
97
147
throw new CommandLineParsingException ( $ "Missing required switch { VALUE_SWITCH_ENDPOINTS } ") ;
98
148
99
- var command = switchValues [ VALUE_SWITCH_COMMAND ] ;
100
-
101
- if ( ! COMMAND_VALUES . Contains ( command ) )
102
- throw new CommandLineParsingException ( $ "Unknown command '{ command } '") ;
103
-
104
149
foreach ( var seenSwitch in seenSwitches )
105
150
{
106
151
if ( ! VALID_SWITHCES_BY_COMMAND [ command ] . Contains ( seenSwitch ) )
@@ -109,21 +154,7 @@ static public ParsedCommandLine ParseArguments(string[] args)
109
154
}
110
155
}
111
156
112
- // Return
113
- return new ParsedCommandLine
114
- {
115
- Command = command ,
116
- Endpoints = switchValues [ VALUE_SWITCH_ENDPOINTS ] ,
117
-
118
- Urls = switchValues [ VALUE_SWITCH_URLS ] ,
119
- Only = switchValues [ VALUE_SWITCH_ONLY ] ,
120
-
121
- ShowResponse = boolValues [ BOOL_SWITCH_SHOWRESPONSE ] ,
122
- NoTestMode = boolValues [ BOOL_SWITCH_NOTESTMODE ] ,
123
- Stop = boolValues [ BOOL_SWITCH_STOP ] ,
124
- Diff = boolValues [ BOOL_SWITCH_DIFF ] ,
125
- List = boolValues [ BOOL_SWITCH_LIST ]
126
- } ;
157
+ return ( stringSwitch , boolSwitches ) ;
127
158
}
128
159
}
129
160
0 commit comments