Example #1
0
        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());
        }