11using System ;
2- using System . Collections . Generic ;
32using MGR . CommandLineParser . Command ;
43using MGR . CommandLineParser . Diagnostics ;
54using MGR . CommandLineParser . Extensibility ;
@@ -20,13 +19,13 @@ internal ParserEngine(IServiceProvider serviceProvider, ILoggerFactory loggerFac
2019 _logger = loggerFactory . CreateLogger < LoggerCategory . Parser > ( ) ;
2120 }
2221
23- internal ParsingResult Parse < TCommand > ( IEnumerator < string > argumentsEnumerator ) where TCommand : class , ICommand
22+ internal ParsingResult Parse < TCommand > ( Arguments arguments ) where TCommand : class , ICommand
2423 {
2524 using ( _logger . BeginParsingForSpecificCommandType ( typeof ( TCommand ) ) )
2625 {
2726 var commandTypeProviders = _serviceProvider . GetServices < ICommandTypeProvider > ( ) ;
2827 var commandType = commandTypeProviders . GetCommandType < TCommand > ( ) ;
29- var parsingResult = ParseImpl ( argumentsEnumerator , commandType ) ;
28+ var parsingResult = ParseImpl ( arguments , commandType ) ;
3029 if ( parsingResult . ParsingResultCode == CommandParsingResultCode . NoCommandFound )
3130 {
3231 _logger . NoCommandFoundAfterSpecificParsing ( ) ;
@@ -41,46 +40,47 @@ internal ParsingResult Parse<TCommand>(IEnumerator<string> argumentsEnumerator)
4140 }
4241 }
4342
44- internal ParsingResult ParseWithDefaultCommand < TCommand > ( IEnumerator < string > argumentsEnumerator )
43+ internal ParsingResult ParseWithDefaultCommand < TCommand > ( Arguments arguments )
4544 where TCommand : class , ICommand
4645 {
4746 using ( _logger . BeginParsingWithDefaultCommandType ( typeof ( TCommand ) ) )
4847 {
49- var commandName = argumentsEnumerator . GetNextCommandLineItem ( ) ;
50- if ( commandName != null )
48+ if ( arguments . Advance ( ) )
5149 {
50+ var commandName = arguments . GetCurrent ( ) ;
5251 _logger . ArgumentProvidedWithDefaultCommandType ( commandName ) ;
5352 var commandTypeProviders = _serviceProvider . GetServices < ICommandTypeProvider > ( ) ;
5453 var commandType = commandTypeProviders . GetCommandType ( commandName ) ;
5554 if ( commandType != null )
5655 {
5756 _logger . CommandTypeFoundWithDefaultCommandType ( commandName ) ;
58- return ParseImpl ( argumentsEnumerator , commandType ) ;
57+ return ParseImpl ( arguments , commandType ) ;
5958 }
6059
6160 _logger . NoCommandTypeFoundWithDefaultCommandType ( commandName , typeof ( TCommand ) ) ;
62- var withArgumentsCommandResult = Parse < TCommand > ( argumentsEnumerator . PrefixWith ( commandName ) ) ;
61+ arguments . Revert ( ) ;
62+ var withArgumentsCommandResult = Parse < TCommand > ( arguments ) ;
6363 return withArgumentsCommandResult ;
6464
6565 }
6666
6767 _logger . NoArgumentProvidedWithDefaultCommandType ( typeof ( TCommand ) ) ;
68- var noArgumentsCommandResult = Parse < TCommand > ( argumentsEnumerator ) ;
68+ var noArgumentsCommandResult = Parse < TCommand > ( arguments ) ;
6969 return noArgumentsCommandResult ;
7070 }
7171 }
7272
73- internal ParsingResult Parse ( IEnumerator < string > argumentsEnumerator )
73+ internal ParsingResult Parse ( Arguments arguments )
7474 {
7575 _logger . ParseForNotAlreadyKnownCommand ( ) ;
76- var commandName = argumentsEnumerator . GetNextCommandLineItem ( ) ;
77- if ( commandName == null )
76+ if ( ! arguments . Advance ( ) )
7877 {
7978 _logger . NoCommandNameForNotAlreadyKnownCommand ( ) ;
8079 var helpWriter = _serviceProvider . GetRequiredService < IHelpWriter > ( ) ;
8180 helpWriter . WriteCommandListing ( ) ;
8281 return new ParsingResult ( null , null , CommandParsingResultCode . NoCommandNameProvided ) ;
8382 }
83+ var commandName = arguments . GetCurrent ( ) ;
8484
8585 using ( _logger . BeginParsingUsingCommandName ( commandName ) )
8686 {
@@ -95,14 +95,14 @@ internal ParsingResult Parse(IEnumerator<string> argumentsEnumerator)
9595 }
9696
9797 _logger . CommandTypeFoundForNotAlreadyKnownCommand ( commandName ) ;
98- return ParseImpl ( argumentsEnumerator , commandType ) ;
98+ return ParseImpl ( arguments , commandType ) ;
9999 }
100100
101101 }
102102
103- private ParsingResult ParseImpl ( IEnumerator < string > argumentsEnumerator , ICommandType commandType )
103+ private ParsingResult ParseImpl ( Arguments arguments , ICommandType commandType )
104104 {
105- var commandObjectBuilder = ExtractCommandLineOptions ( commandType , argumentsEnumerator ) ;
105+ var commandObjectBuilder = ExtractCommandLineOptions ( commandType , arguments ) ;
106106 if ( commandObjectBuilder == null )
107107 {
108108 return new ParsingResult ( null , null , CommandParsingResultCode . CommandParametersNotValid ) ;
@@ -117,17 +117,14 @@ private ParsingResult ParseImpl(IEnumerator<string> argumentsEnumerator, IComman
117117 }
118118 return new ParsingResult ( commandObjectBuilder . GenerateCommandObject ( ) , null , CommandParsingResultCode . Success ) ;
119119 }
120- private ICommandObjectBuilder ExtractCommandLineOptions ( ICommandType commandType , IEnumerator < string > argumentsEnumerator )
120+
121+ private ICommandObjectBuilder ExtractCommandLineOptions ( ICommandType commandType , Arguments arguments )
121122 {
122123 var commandObjectBuilder = commandType . CreateCommandObjectBuilder ( _serviceProvider ) ;
123124 var alwaysPutInArgumentList = false ;
124- while ( true )
125+ while ( arguments . Advance ( ) )
125126 {
126- var argument = argumentsEnumerator . GetNextCommandLineItem ( ) ;
127- if ( argument == null )
128- {
129- break ;
130- }
127+ var argument = arguments . GetCurrent ( ) ;
131128 if ( argument . Equals ( Constants . EndOfOptions ) )
132129 {
133130 alwaysPutInArgumentList = true ;
@@ -166,7 +163,17 @@ private ICommandObjectBuilder ExtractCommandLineOptions(ICommandType commandType
166163
167164 if ( option . ShouldProvideValue )
168165 {
169- value = value ?? argumentsEnumerator . GetNextCommandLineItem ( ) ;
166+ if ( value == null )
167+ {
168+ if ( ! arguments . Advance ( ) )
169+ {
170+ var console = _serviceProvider . GetRequiredService < IConsole > ( ) ;
171+ console . WriteLineError ( Constants . ExceptionMessages . FormatParserOptionValueNotFoundForCommand ( commandType . Metadata . Name , optionText ) ) ;
172+ return null ;
173+ }
174+
175+ value = arguments . GetCurrent ( ) ;
176+ }
170177 }
171178
172179 option . AssignValue ( value ) ;
0 commit comments