private IParsingResultsDictionary parseConfigFromCommandLine() { var arguments = new Queue <string>(_source.Args); var plainValueCounter = 0; var resultsBuilder = new ParsingResultsBuilder(_source.DuplicateKeyBehavior); var lastArgumentString = _source.Args.First(); while (arguments.Any()) { var currentArgumentString = arguments.Dequeue(); var parsedArgument = ArgumentType.CreateFrom(currentArgumentString); switch (parsedArgument) { case ArgumentType.SingleDash dashArgument: handleSingleDashArgument(resultsBuilder, arguments, dashArgument); break; case ArgumentType.DoubleDash doubleDashArgument: handleDoubledashArgument(resultsBuilder, arguments, doubleDashArgument); break; case ArgumentType.Assignment assignment: if (_source.AllowDirectAssignments) { resultsBuilder.Add(assignment.Key, assignment.Value); } else { resultsBuilder.Error(new NotSupportedException($"Invalid argument '{assignment.Argument}' as direct assignments are not allowed.")); } break; case ArgumentType.Invalid invalid: resultsBuilder.Error(new ParsingException("Invalid argument.", $"Argument somewhere near: '{lastArgumentString.Limit(16)}'")); break; case ArgumentType.Plain plain: if (plainValueCounter < _valueDefinitions.Count) { resultsBuilder.Add(_valueDefinitions[plainValueCounter], plain.Argument); } else { resultsBuilder.Error(new IndexOutOfRangeException($"No more than {_valueDefinitions.Count} value arguments are allowed.")); } plainValueCounter++; break; } lastArgumentString = currentArgumentString; } if (_valueDefinitions.Count > plainValueCounter) { resultsBuilder.Error(new ValueRequiredException(string.Empty, $"Not all required values have been provided. Expected: {_valueDefinitions.Count}, Provided: {plainValueCounter}")); } return(resultsBuilder.GetResults()); }