@@ -21,13 +21,13 @@ internal ParserEngine(IServiceProvider serviceProvider, ILoggerFactory loggerFac
21
21
_logger = loggerFactory . CreateLogger < LoggerCategory . Parser > ( ) ;
22
22
}
23
23
24
- internal async Task < ParsingResult > Parse < TCommand > ( IEnumerator < string > argumentsEnumerator ) where TCommand : class , ICommand
24
+ internal async Task < ParsingResult > Parse < TCommand > ( Arguments arguments ) where TCommand : class , ICommand
25
25
{
26
26
using ( _logger . BeginParsingForSpecificCommandType ( typeof ( TCommand ) ) )
27
27
{
28
28
var commandTypeProviders = _serviceProvider . GetServices < ICommandTypeProvider > ( ) ;
29
29
var commandType = await commandTypeProviders . GetCommandType < TCommand > ( ) ;
30
- var parsingResult = ParseImpl ( argumentsEnumerator , commandType ) ;
30
+ var parsingResult = ParseImpl ( arguments , commandType ) ;
31
31
if ( parsingResult . ParsingResultCode == CommandParsingResultCode . NoCommandFound )
32
32
{
33
33
_logger . NoCommandFoundAfterSpecificParsing ( ) ;
@@ -42,46 +42,47 @@ internal async Task<ParsingResult> Parse<TCommand>(IEnumerator<string> arguments
42
42
}
43
43
}
44
44
45
- internal async Task < ParsingResult > ParseWithDefaultCommand < TCommand > ( IEnumerator < string > argumentsEnumerator )
45
+ internal async Task < ParsingResult > ParseWithDefaultCommand < TCommand > ( Arguments arguments )
46
46
where TCommand : class , ICommand
47
47
{
48
48
using ( _logger . BeginParsingWithDefaultCommandType ( typeof ( TCommand ) ) )
49
49
{
50
- var commandName = argumentsEnumerator . GetNextCommandLineItem ( ) ;
51
- if ( commandName != null )
50
+ if ( arguments . Advance ( ) )
52
51
{
52
+ var commandName = arguments . GetCurrent ( ) ;
53
53
_logger . ArgumentProvidedWithDefaultCommandType ( commandName ) ;
54
54
var commandTypeProviders = _serviceProvider . GetServices < ICommandTypeProvider > ( ) ;
55
55
var commandType = await commandTypeProviders . GetCommandType ( commandName ) ;
56
56
if ( commandType != null )
57
57
{
58
58
_logger . CommandTypeFoundWithDefaultCommandType ( commandName ) ;
59
- return ParseImpl ( argumentsEnumerator , commandType ) ;
59
+ return ParseImpl ( arguments , commandType ) ;
60
60
}
61
61
62
62
_logger . NoCommandTypeFoundWithDefaultCommandType ( commandName , typeof ( TCommand ) ) ;
63
- var withArgumentsCommandResult = await Parse < TCommand > ( argumentsEnumerator . PrefixWith ( commandName ) ) ;
63
+ arguments . Revert ( ) ;
64
+ var withArgumentsCommandResult = await Parse < TCommand > ( arguments ) ;
64
65
return withArgumentsCommandResult ;
65
66
66
67
}
67
68
68
69
_logger . NoArgumentProvidedWithDefaultCommandType ( typeof ( TCommand ) ) ;
69
- var noArgumentsCommandResult = await Parse < TCommand > ( argumentsEnumerator ) ;
70
+ var noArgumentsCommandResult = await Parse < TCommand > ( arguments ) ;
70
71
return noArgumentsCommandResult ;
71
72
}
72
73
}
73
74
74
- internal async Task < ParsingResult > Parse ( IEnumerator < string > argumentsEnumerator )
75
+ internal async Task < ParsingResult > Parse ( Arguments arguments )
75
76
{
76
77
_logger . ParseForNotAlreadyKnownCommand ( ) ;
77
- var commandName = argumentsEnumerator . GetNextCommandLineItem ( ) ;
78
- if ( commandName == null )
78
+ if ( ! arguments . Advance ( ) )
79
79
{
80
80
_logger . NoCommandNameForNotAlreadyKnownCommand ( ) ;
81
81
var helpWriter = _serviceProvider . GetRequiredService < IHelpWriter > ( ) ;
82
82
await helpWriter . WriteCommandListing ( ) ;
83
83
return new ParsingResult ( null , null , CommandParsingResultCode . NoCommandNameProvided ) ;
84
84
}
85
+ var commandName = arguments . GetCurrent ( ) ;
85
86
86
87
using ( _logger . BeginParsingUsingCommandName ( commandName ) )
87
88
{
@@ -96,14 +97,14 @@ internal async Task<ParsingResult> Parse(IEnumerator<string> argumentsEnumerator
96
97
}
97
98
98
99
_logger . CommandTypeFoundForNotAlreadyKnownCommand ( commandName ) ;
99
- return ParseImpl ( argumentsEnumerator , commandType ) ;
100
+ return ParseImpl ( arguments , commandType ) ;
100
101
}
101
102
102
103
}
103
104
104
- private ParsingResult ParseImpl ( IEnumerator < string > argumentsEnumerator , ICommandType commandType )
105
+ private ParsingResult ParseImpl ( Arguments arguments , ICommandType commandType )
105
106
{
106
- var commandObjectBuilder = ExtractCommandLineOptions ( commandType , argumentsEnumerator ) ;
107
+ var commandObjectBuilder = ExtractCommandLineOptions ( commandType , arguments ) ;
107
108
if ( commandObjectBuilder == null )
108
109
{
109
110
return new ParsingResult ( null , null , CommandParsingResultCode . CommandParametersNotValid ) ;
@@ -118,21 +119,18 @@ private ParsingResult ParseImpl(IEnumerator<string> argumentsEnumerator, IComman
118
119
}
119
120
return new ParsingResult ( commandObjectBuilder . GenerateCommandObject ( ) , null , CommandParsingResultCode . Success ) ;
120
121
}
121
- private ICommandObjectBuilder ExtractCommandLineOptions ( ICommandType commandType , IEnumerator < string > argumentsEnumerator )
122
+
123
+ private ICommandObjectBuilder ExtractCommandLineOptions ( ICommandType commandType , Arguments arguments )
122
124
{
123
125
var commandObjectBuilder = commandType . CreateCommandObjectBuilder ( _serviceProvider ) ;
124
126
if ( commandObjectBuilder == null )
125
127
{
126
128
return null ;
127
129
}
128
130
var alwaysPutInArgumentList = false ;
129
- while ( true )
131
+ while ( arguments . Advance ( ) )
130
132
{
131
- var argument = argumentsEnumerator . GetNextCommandLineItem ( ) ;
132
- if ( argument == null )
133
- {
134
- break ;
135
- }
133
+ var argument = arguments . GetCurrent ( ) ;
136
134
if ( argument . Equals ( Constants . EndOfOptions ) )
137
135
{
138
136
alwaysPutInArgumentList = true ;
@@ -171,7 +169,17 @@ private ICommandObjectBuilder ExtractCommandLineOptions(ICommandType commandType
171
169
172
170
if ( option . ShouldProvideValue )
173
171
{
174
- value = value ?? argumentsEnumerator . GetNextCommandLineItem ( ) ;
172
+ if ( value == null )
173
+ {
174
+ if ( ! arguments . Advance ( ) )
175
+ {
176
+ var console = _serviceProvider . GetRequiredService < IConsole > ( ) ;
177
+ console . WriteLineError ( Constants . ExceptionMessages . FormatParserOptionValueNotFoundForCommand ( commandType . Metadata . Name , optionText ) ) ;
178
+ return null ;
179
+ }
180
+
181
+ value = arguments . GetCurrent ( ) ;
182
+ }
175
183
}
176
184
177
185
option . AssignValue ( value ) ;
0 commit comments